没有模板的 Tornado XSRF 令牌

bcw*_*b88 3 cookies post tornado csrf backbone.js

我目前正在实施一个包含 Backbone Marionette over Tornado 的项目,并且遇到了 XSRF 令牌的问题。由于 XSRF 不是通过模板传递的(通过 xsrf_form_html() ),当用户登录应用程序时,向登录 url "//login" 发出 GET 请求并通过以下方式检索 xsrf 令牌:

class LoginHandler(BaseHandler):
"""
"""

def get(self):
    token = self.xsrf_token
    self.respond(dict(_xsrf=token))
Run Code Online (Sandbox Code Playgroud)

self.respond 看起来像:

def respond(self, response=None):
    """
    :param data:
    :return:
    """

    if response is not None:
        self.set_header('Content-Type', 'application/json')
        self.write(json.dumps(response))
    else:
        self.set_header('Content-Type', 'text/plain')
        self.write("")
Run Code Online (Sandbox Code Playgroud)

但是,每当"_xsrf" : token对服务器进行 POST(字段值为)时,我都会收到标志性的“XSRF cookie 与 POST 参数不匹配”。看起来好像服务器上的 xsrf 令牌在每次请求时都会重新生成,因为 xsrf cookie 不存在(到目前为止,我试图确保 cookie 存在的尝试失败了......不完全确定如何坚持)。也许我在这里遗漏了(或误解了)一些关键的东西,但我希望那里的其他人遇到过这样的范式并有解决方案或建议。

提前致谢!

Ben*_*ell 5

xsrf 令牌必须以两种不同的方式发送,并且它们必须匹配。一次在 cookie 中,一次在标题中或在表单编码的 POST 正文中(正文不能是 json 并且必须具有表单编码或多部分内容类型)。只要您的客户可以发送标头,通常首选标头;你需要同时发送Cookie: _xsrf=fooX-Xsrf-Token: foo

从 Tornado 3.2.2 开始,xsrf 令牌包含一个随机组件来对抗 BREACH 攻击,因此两个令牌可以匹配而不相同。