>在每个页面的开头生成$_SESSION [‘token’].我已经知道使用$_COOKIES是完全错误的,因为它们是针对每个请求自动发送的.
>在每个< form>中,输入以下内容:< input type =“hidden”name =“t”value =“<?PHP echo'$_SESSION ['token'];?>”>附加.
> $_SESSION [‘token’];用$_POST [‘t’]验证
现在我有几个小问题:
>这是防止CSRF的好方法吗?如果没有请解释.
>当打开另一个页面并设置相同的$_SESSION变量时,前一个(仍然打开的)页面变为无效,如何防止这种情况?
>对于表单这个方法很明确,但如何处理普通链接?是否有必要将令牌附加到每个链接?
非常感谢你提前.
Is this a good way to prevent CSRF?
是.这样做是为了强制客户端在表单上执行GET,然后才能对表单处理程序执行POST操作.这可以防止现代浏览器中的CSRF,因为浏览器会阻止客户端Javascript对外部域执行XHR GET请求,因此第三方无法在其网站上模仿您的表单并成功获得提交的有效令牌.
When another page is opened as well that sets the same $_SESSION variable,the prevIoUs (still open) page becomes invalid,how to prevent this?
允许多个令牌一次有效,在会话中保留一组有效令牌.或者,根本不存储令牌,而是使用令牌签名方案.我已经涉足并解释了here.备选方案2:只使用一个令牌进行整个会话,而不会使令牌失效. (在评论中向@SilverlightFox提示帽子)
For forms this method is clear,but how to handle normal links? Is it necessary to append the token to each link as well?
不需要.你只需要保护POST请求,因为大概只有POST请求才能改变敏感数据(wink wink nudge nudge,你坚持REST约定,对吧?!)XHR GET请求已被浏览器端阻止.