Moh*_*eri 5 php url get csrf token
我想使用令牌来防止对我的网站进行CSRF攻击(用PHP编写)。我已经在表格中使用它,并且效果很好。但是注销链接不是一种形式。它只是一个超链接。
如果我将令牌放在查询字符串中像这样,是否安全:
<a href="logout.php?token=9ae328eea8a72172a2426131a6a41adb">Logout</a>
Run Code Online (Sandbox Code Playgroud)
如果有问题,您有什么建议和解决方案?
是的,如果CSRF 令牌是“不可猜测的”并且经过验证:两种情况下的方法是相同的。
来自维基百科的跨站点请求伪造 - 预防:
网站有各种可用的 CSRF 对策。在所有表单提交和副作用 URL中都需要一个秘密的、特定于用户的令牌可以防止 CSRF;攻击者的站点无法在其提交中放置正确的令牌。
令牌是来自表单值还是查询字符串参数1并不重要。通过在表单中包含令牌来防止 CSRF 的方法适用于(并适用于)超链接2。
1可以拦截 URL 的中间人/代理可以很容易地拦截 HTML 表单。这超出了标准 CSRF 攻击或减轻此类攻击的范围。在这种情况下,CSRF 令牌值是“可知的”并且系统不安全。
2这假设令牌是每个用户(和时间敏感)的值。在大多数情况下,会话 ID 的简单 HMAC 哈希应该就足够了。
我认为在 GET 请求中使用 CSRF 令牌的主要缺点之一是,不称职的用户可能会通过复制带有令牌的链接并将其粘贴到一些公共内容(如评论/帖子/等)中来轻松披露他的令牌......也是 GET包括 CSRF 令牌在内的查询参数通常由 HTTP 服务器/代理记录,这会带来另一个风险。
所以我建议你使用这样的东西来实现 CSRF 安全链接:
<form name="logout" action="logout.php" method="post">
<input type="hidden" name="token" value="9ae328eea8a72172a2426131a6a41adb"/>
</form>
...
<a href="/nojs.html" onclick="document.logout.submit(); return false">Logout</a>
Run Code Online (Sandbox Code Playgroud)