【问题标题】:Tornado XSRF token without templating没有模板的 Tornado XSRF 令牌
【发布时间】:2014-09-30 17:47:28
【问题描述】:

我目前正在通过 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 存在的尝试失败了......不完全确定如何坚持)。也许我在这里遗漏(或误解)了一些关键的东西,但我希望那里的其他人遇到过这样的范例并有解决方案或建议。

提前致谢!

【问题讨论】:

    标签: post backbone.js cookies tornado csrf


    【解决方案1】:

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

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

    【讨论】:

    • 嘿,Ben,谢谢 - 我在发布这篇文章大约 30 分钟后才意识到这一点,却忘了回答我自己的问题。我想我希望 Tornado 也有一个持久的存储(回想起来,我不确定我为什么希望这样......)。感谢您的答复。对于在 cookie xsrf 周围进行加密并在后面加上解码器以防止令牌可能泄漏,您有何看法?
    • 我不确定加密对这里有什么帮助,因为 xsrf 令牌的意义在于合法客户端可以看到它并将其传回给您。您必须更清楚您的威胁模型以及您打算如何管理密钥(我认为全局对称密钥没有意义,尽管每个用户和/或非对称密钥可能)。我认为有状态会话方案比向随机令牌添加加密更有可能产生安全性改进。
    • 我对此进行了更多思考,虽然总体目标是防止恶意代理获取和使用令牌,但这并不能特别缓解它,所以我收回了这个想法。持久化它并覆盖 get_xsrf_token 以从后端提取而不是在响应标头中发送它会更好。再次感谢你的帮助!如果我有超过 15 个代表,我会投票(一旦完成,我会记得回来并这样做)
    猜你喜欢
    • 2017-10-22
    • 2013-07-09
    • 1970-01-01
    • 2020-10-29
    • 1970-01-01
    • 2020-11-09
    • 2016-11-16
    • 2016-08-31
    相关资源
    最近更新 更多