2012-10-15 6 views
10

次のコードでわかるように、に作業を委任する登録のためにGETが登録されています。Tornado - POSTから足りない '_xsrf'引数

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) 

私は私のWebブラウザから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

私はあなたの設定でクロスサイトリクエスト偽造Cookieが有効になっていると思います(デフォルトではオンに設定されています)

Tornado's XSRF is here

この問題を解決するには、あなたの設定でそれをオフにします。

settings = { 
    "xsrf_cookies": False, 
} 

注:通常、あなたがこれをオフにしたくないと、通常、あなたがこのようなテンプレートのHTMLを生成することと思います。 XSRFクッキーを追加するxsrfビットに注意してください。

<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> 

--- EDIT以下のコメント---代わりの :

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

私のPythonコードは - https://www.refheap.com/paste/5955です。テンプレートはhttps://www.refheap.com/paste/5956です。 – missingfaktor

0

矛盾があります: どうすればgetを作成し、method="post"という形式で入力しますか?この理由がある場合error 403

getを使用すると、xsrfの保護は必要ありません。他に、あなたはとてもXSRFは、あなたがそれをあなたのレンダリングされたHTML内の隠されたタグを見つけることができます

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

としてフォームの宣言の後にそれを追加します。

関連する問題