首先是一些背景。
我一直在使用 nonce 令牌以wordpress
允许将操作附加到 nonce 的相同方式签署我的表单数据:
// editing post id:10
$post_id = 10;
$nonce = create_nonce( 'edit-post-'.$post_id );
echo '<input type="hidden" name="post_id" value="'.$post_id.'">';
echo '<input type="hidden" name="nonce" value="'.$nonce.'">';
这允许我稍后检查用户是否正在编辑我授予他权限的帖子,因为我重建了随机数并检查我收到的随机数是否与我构建的相同:
$server_nonce = create_nonce( 'edit-post-'.$_POST['post_id'] );
if( $server_nonce != $_POST['nonce'] )
{
echo 'bad guy...';
}
到目前为止,我将此方法误解为一种反 CSRF 令牌,它为我提供了 CSRF 保护。
当我深入研究 CSRF 问题时,我发现这个解决方案并不能 100% 保护我免受 CSRF 的影响,因为:
- 可以使用接收到的数据在服务器中重建随机数。CSRF 不能重建。
- 对于窗口时间的表单,nonce 标记将是相同的。CSRF 在每个请求中都必须是唯一的。
所以,这是我的问题:
可以在一个表单中使用两个令牌来保护 CSRF 和数据签名吗?有没有办法将这两个令牌结合起来?