2012-10-15 24 views
10

से अनुपलब्ध है जैसा कि निम्न कोड में देखा जा सकता है, मेरे पास पंजीकरण के लिए GET है, जो POST पर अपना काम प्रस्तुत करता है।टोरनाडो - '_xsrf' तर्क POST

class RegistrationHandler(tornado.web.RequestHandler): 
    def get(self): 
     s = """ 
      <h1>Register</h1> 
       <form method="post" action="/register"> 
        <div> 
         <label>User</label> 
         <input name="user_name" value="[email protected]"/> 
        </div> 
        <div> 
         <label>password</label> 
         <input name="password" type="password"/> 
        </div> 
        <div> 
         <input type="submit" value="submit"/> 
        </div> 
       </form> 
     """ 
     self.write(s) 

    @log_exception() 
    def post(self): 
     user_name = self.request.arguments['user_name'] 
     password = self.request.arguments['password'] 
     log.debug('Registering user with credentials %r' % (user_name, password)) 
     with sa_session() as db_session: 
      User.register(user_name, password, db_session) 

जब मैं अपने वेब ब्राउज़र से URL तक पहुँचने, मैं एक पंजीकरण फार्म मिलता है, भेजने जिसके बाद मैं "403: निषिद्ध"।

कंसोल लॉग:

2012-10-15 11:27:42,482 - __main__ - DEBUG - Starting server on port 8080 
2012-10-15 11:27:49,377 - root - INFO - 304 GET /register (127.0.0.1) 0.78ms 
2012-10-15 11:27:53,143 - root - WARNING - 403 POST /register (127.0.0.1): '_xsrf' argument missing from POST 
2012-10-15 11:27:53,144 - root - WARNING - 403 POST /register (127.0.0.1) 1.05ms 

इस त्रुटि का क्या मतलब है और मैं इसे कैसे सही हो? धन्यवाद।

उत्तर

16

मुझे लगता है कि आपके पास (डिफ़ॉल्ट रूप से यह चालू है) में क्रॉस-साइट अनुरोध जालसाजी कुकीज़ सक्षम है।

Tornado's XSRF is here

इसे ठीक करने के अपनी सेटिंग में इसे बंद:

settings = { 
    "xsrf_cookies": False, 
} 

नोट: आम तौर पर आप इस बंद करना चाहते हैं न और सामान्य रूप से आप इस तरह एक टेम्पलेट में HTML पैदा होगी: कृपया एक्सएसआरएफ बिट नोट करें जो एक्सएसआरएफ कुकी जोड़ता है।

<form method="post" action="/register"> 
    <input name="user_name" value="[email protected]"/> 
    <input name="password" type="password"/> 
    <input type="submit" value="submit"/> 
{% raw xsrf_form_html() %} 
</form> 

--- संपादित निम्नलिखित टिप्पणी --- बजाय :

def get(self): 
     loader = template.Loader("resources") 
     page_contents = loader.load('register_page.html').generate() 
     self.write(page_contents) 

है:

def get(self): 
    self.render("../resources/register_page.html") 

या बेहतर:

def get(self): 
    self.render("register_page.html") 

(और रख दिया अपने टेम्पलेट निर्देशिका में)

+0

यह एक त्रुटि उठाता है जिसका नाम 'xsrf_form_html()' परिभाषित नहीं किया गया है। क्या मुझे कुछ आयात चाहिए? यदि हां, तो मैं इसे अपने टेम्पलेट में कैसे जोड़ूं? – missingfaktor

+0

आपको किसी विशेष आयात की आवश्यकता नहीं है। ध्यान दें कि xsrf_form_html() केवल टेम्पलेट में काम करेगा। आपके द्वारा ऊपर पोस्ट किया गया कोड टेम्पलेट नहीं है। –

+0

यहां मेरा पायथन कोड है - https://www.refheap.com/paste/5955, और यहां मेरा टेम्पलेट है - https://www.refheap.com/paste/5956। – missingfaktor

0

एक संघर्ष है: आप get कैसे बनाते हैं और इस फ़ॉर्म में आपने method="post" रखा है? यह error 403

यदि आप get का उपयोग करते हैं, तो आपको xsrf सुरक्षा की आवश्यकता नहीं होगी। अन्यथा, आप फॉर्म घोषणा के बाद इसे

<form method="post" action="/register"> 
{% raw xsrf_form_html() %} # the 'raw' word is to force escape to be desactivated (it is by default activated) 

तो xsrf आपको इसे अपने प्रस्तुत HTML में एक छिपी हुई टैग मिल जाएगी।

संबंधित मुद्दे