我正在努力阻止CSRF https://www.owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF) in php /questions/tagged/php通过以下方式:
A $_SESSION['token']
在每个页面的开头生成。我已经知道使用$_COOKIES
完全错误,因为它们是针对每个请求自动发送的。
In each <form>
,以下输入:<input type="hidden" name="t" value="<?php echo '$_SESSION['token']; ?>">
已附加。
The $_SESSION['token'];
被验证与$_POST['t']
现在我有几个小问题:
- 这是防止 CSRF 的好方法吗?如果没有请解释。
- 当另一个页面也打开时设置相同
$_SESSION
变量,之前的(仍然打开的)页面变得无效,如何防止这种情况?
- 对于表单来说这个方法很清楚,但是如何处理普通的链接呢?是否还需要将令牌附加到每个链接?
预先非常感谢您。
这是防止 CSRF 的好方法吗?
是的。其作用是强制客户端先对表单执行 GET,然后才能向表单处理程序执行 POST。这可以防止 CSRF在现代浏览器中由于浏览器将阻止客户端 Javascript 向外部域发出 XHR GET 请求,因此第 3 方无法在其网站上模仿您的表单并成功获取用于提交的有效令牌。
当打开另一个设置相同 $_SESSION 变量的页面时,前一个(仍然打开的)页面将变得无效,如何防止这种情况?
允许多个令牌同时有效,在会话中保留一组有效令牌。或者,根本不存储令牌并使用令牌签名方案。我已经涉足并解释过here https://github.com/deceze/Kunststube-CSRFP。替代方案 2:在整个会话中仅使用单个令牌,而不使令牌失效。 (在评论中向@SilverlightFox 致敬)
对于表单来说这个方法很清楚,但是如何处理普通的链接呢?是否还需要将令牌附加到每个链接?
不需要。您只需要保护 POST 请求,因为大概只有 POST 请求可以更改敏感数据(眨眼轻推,您坚持 REST 约定,对吧?!)并且 XHR GET 请求已经在浏览器端被阻止。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)