我正在尝试以通过javascript(而不是jquery)AJAX函数提交的形式传递CSRF令牌。公认的智慧似乎是将令牌作为实际形式的隐藏输入。我认为这个问题是使用浏览器检查工具可以很容易地看到隐藏输入的内容。那么有更安全的方式传递令牌吗?
答案 0 :(得分:1)
在源代码中可以访问CSRF令牌不是问题,因为它并不意味着隐藏在客户端浏览器中。当我说"隐藏"在这里,我不是在谈论HTML属性"隐藏"一个表单,但令牌的披露,应该是通过分析页面源,脚本执行或网络流量(真正隐藏)。
您必须了解为什么CSRF令牌有用。如果攻击者创建了一个恶意网页,托管在外部域下,POST或GET到您的网站,那么他可以期待一个经过身份验证的用户(受害者 - 在cookie中具有开放会话和sesion ID)来执行POST / GET:受害者的浏览器将检测目标URL,将cookie /会话ID添加到GET / POST标头,并代表经过身份验证的用户执行操作(例如:"销毁我的帐户")
如果您在源中创建了一个随机的CSRF令牌,则攻击者无法读取它(因为他无法代表受害者的浏览器加载页面并阅读其内容,这要归功于跨域内容隔离)和因此无法构建将执行GET或POST的恶意页面。
对于其他方法,其他网站使用唯一的静态CSRF令牌(在会话初始化时按用户生成),该令牌保存在cookie中并通过JS包含在站点的表单中。结果是相同的,令牌将是表单提交的一部分(并且客户端的浏览器可以访问)。您只需避免为每个表单生成CSRF令牌,服务器可以轻松地将令牌与客户端的会话数据进行比较,而不是执行旁道令牌管理。