我在我的网站上有一个 Action :
http://mysite.com/User/Logout
这会将当前用户从他/她的 session 中注销。由于这是一个简单的 GET 请求,恶意用户可以创建指向此页面的链接,甚至可以将此链接放入图像的 src
属性中,从而强制用户注销。我仍然希望保持注销链接的简单性,而不必走得太远,但同时我希望能够防止上述情况的发生。
有什么想法吗?
最佳答案
好吧,您可以采取一些措施来帮助抵御 CSRF 攻击:
使用表格和随机 token 。因此,不要使用“链接”,而是使用在 session 中设置为表单的随机标记
<form action="/User/logout" method="post"> <submit name="logout" value="Logout" /> <input type="hidden" name="token" value="<?php echo getSessionToken(); ?>" /> </form>
请注意,POST 最适合此类操作,但您可以轻松地将表单更改为 GET。
然后在 php 中,只需执行以下操作:
if (getSessionToken(true) != $_POST['token']) { die('CSRF!'); }
注意
getSessionToken
应该像这样工作:function getSessionToken($reset = false) { if (!isset($_SESSION['random_token'])) { $_SESSION['random_token'] = sha1(uniqid(mt_rand(), true)); } $token = $_SESSION['random_token']; if ($reset) { unset($_SESSION['random_token']); } return $token; }
另请注意,每当您获取 token 以检查它时,您应该将其重置为新的东西(这就是它所做的)。这可以防止攻击者在提交时检测到 token 并重新提交值的重播攻击。
如果您必须使用链接,请在链接中嵌入 token 。但请注意,这更容易受到攻击,因为用户有可能将链接复制并粘贴给其他人。只要它是一个自重置 token ,多个选项卡应该不会有太大问题。但意识到这不是最佳的:
<a href="/User/logout?token=<?php echo getSessionToken(); ?>">Logout</a>
绝对比没有好。但我仍然建议使用表格以获得最佳保护。
我强烈建议阅读并关注 OWASP CSRF Guidelines用于防止 CSRF。它会告诉您几乎所有您需要知道的信息,以及为什么...
关于php - 防止从 PHP 中不受信任的来源发生注销操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5154401/