在单个页面上为多个表单生成CSRF令牌

Jus*_*tin 11 security csrf

我目前正在CSRF我的表单中生成一个令牌,以防止跨站点请求伪造.看起来像:

<form method="post" action="action.php">
   <input type="hidden" id="security_token" name="security_token" value="gTt96phAcretR99rafEjepHebrEZadEdezadagaZ3gAS5es33WReJeZaMADU2AWr" />
   ...
</form>
Run Code Online (Sandbox Code Playgroud)

问题是我在一个页面上有多个表单.我必须创建一个安全令牌为每个表单等等security_token_1,security_token_2或可我根本不是生成的表格内的安全令牌,将其追加到属性到整个的body像标签:

<body data-csrf-token="gTt96phAcretR99rafEjepHebrEZadEdezadagaZ3gAS5es33WReJeZaMADU2AWr">
...
</body>
Run Code Online (Sandbox Code Playgroud)

这种不安全吗?它简化了一些事情,因为我可以简单地将安全性令牌附加到body元素而不是处理多个安全性令牌.

感谢您的见解和评论.

Mik*_*ant 15

实际上没有任何理由你不能为两个表单生成相同的生成令牌,每个表单中的每个隐藏字段都具有相同的name属性.

毕竟,您真正想要验证的是表单请求是来自具有有效会话的用户的入站,并且一次只能主动发布一个表单.因此,您将比较针对用户存储在会话中的令牌发布的令牌.为了做到这一点,不需要有多个令牌值.

为了您的需要更新基于AJAX的职位令牌的情况下,你需要做的是,正如你所说的,通过新创建的令牌早在AJAX响应,然后更新的隐藏字段值到新的令牌值.