php - 防止从 PHP 中不受信任的来源发生注销操作

标签 php security xss csrf csrf-protection

我在我的网站上有一个 Action :

http://mysite.com/User/Logout

这会将当前用户从他/她的 session 中注销。由于这是一个简单的 GET 请求,恶意用户可以创建指向此页面的链接,甚至可以将此链接放入图像的 src 属性中,从而强制用户注销。我仍然希望保持注销链接的简单性,而不必走得太远,但同时我希望能够防止上述情况的发生。

有什么想法吗?

最佳答案

好吧,您可以采取一些措施来帮助抵御 CSRF 攻击:

  1. 使用表格和随机 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 并重新提交值的重播攻击。

  2. 如果您必须使用链接,请在链接中嵌入 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/

相关文章:

html-entities - 如何不使用 owasp antisamy 将特殊字符转换为 html 实体

javascript - 调用javascript函数错误

php - 如何根据一组特定的编码约定检查 PHP 代码?

php - 从标准对象中提取变量

php - jQuery Ajax -> 如何避免为一个查询包含每个类

php - require_once "../../file/config.php"是在现代标准(2013)中隐藏我的配置文件的最安全方式吗?

使用 PhoneGap 创建移动应用程序时的安全注意事项

c - 如果程序设置了 setuid 位,为什么/proc/self 中的文件最终会归 root 所有?

php - PDO 弄乱了我的 CSS/HTML 布局

security - JWT 刷新 token