Bas*_*ein 7 php security session session-variables csrf
$_SESSION['token']在每页开头生成A. 我已经知道使用$_COOKIES完全错误,因为它们是针对每个请求自动发送的.
在每个中<form>,<input type="hidden" name="t" value="<?php echo '$_SESSION['token']; ?>">附加以下输入:
该$_SESSION['token'];验证与$_POST['t']
现在我有几个小问题:
$_SESSION变量时,前一个(仍然打开的)页面变为无效,如何防止这种情况?非常感谢你提前.
这是防止CSRF的好方法吗?
是.这样做是为了强制客户端在表单上执行GET,然后才能对表单处理程序执行POST操作.这可以防止现代浏览器中的CSRF ,因为浏览器会阻止客户端Javascript对外部域执行XHR GET请求,因此第三方无法在其网站上模仿您的表单并成功获得提交的有效令牌.
当打开另一个页面并设置相同的$ _SESSION变量时,前一个(仍然打开的)页面变为无效,如何防止这种情况?
允许多个令牌一次有效,在会话中保留一组有效令牌.或者,根本不存储令牌,而是使用令牌签名方案.我已经涉足并解释了这里.备选方案2:在整个会话中使用单个令牌,而不会使令牌无效.(在评论中提到@SilverlightFox的帽子)
对于表单这个方法很明确,但如何处理普通链接?是否有必要将令牌附加到每个链接?
不需要.你只需要保护POST请求,因为大概只有POST请求才能改变敏感数据(wink wink nudge nudge,你坚持REST约定,对吧?!)XHR GET请求已被浏览器端阻止.