没有模板的Tornado XSRF令牌

时间:2014-08-07 13:04:01

标签: post backbone.js cookies tornado csrf

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

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

def get(self):
    token = self.xsrf_token
    self.respond(dict(_xsrf=token))

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("")

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

提前致谢!

1 个答案:

答案 0 :(得分:3)

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

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