【问题标题】:CSRF PHP Prevention MechanismCSRF PHP 预防机制
【发布时间】:2017-02-15 17:23:11
【问题描述】:

我读过很多关于 CSRF 的文章,几乎所有文章都有相同的解决方案,即隐藏令牌,所以我写了一个代码来防止 CSRF,然后我尝试破解我自己的页面,但它没有用,我想知道我的代码是否是 CSRF 防弹的,以及它周围是否有任何东西。

我有四个页面,其中包含表单,因此在每个页面中我会写以下内容:

            if (isset($_POST['submit'])){

            // Check for CSRF token
            if ($_SESSION['token'] === $_POST['token']){

                // write to db

            }else{
                 // CSRF attack has been detected
                 die("CSRF :<br>1: $_SESSION[token]  <br> 2: $_POST[token]");

            }

        }else{
            // assign CSRF prevention token
            $form_token = md5((rand(1,89412) * 256 / 4).$date.time());
            $_SESSION['token'] = $form_token;
        }
        ?>
        <form action='' method='post'>
        <input type='hidden' name='token' value='<?echo $form_token;?>'>

这种方法足以阻止攻击者在我的网站上使用 CSRF 吗?

非常感谢。

【问题讨论】:

  • 这可以防止发布“盲目”或自动提交表单......这只是防止攻击的一部分。您的会话 (id) 也必须是安全的,因此它不会被劫持 - 会话 cookie 也是如此。
  • 这是否意味着我的网站仍然容易受到 CSRF 的攻击?如果是这样,我该如何预防。
  • 好吧,我不是安全专家……但如果我设法劫持了您/用户的会话 ID,那么表单令牌将毫无用处。
  • 感谢 Djot 的快速回复,除了始终使用 https,我还能做些什么来保护我的会话?
  • 重新生成会话,当用户登录/注销时,获得更高的权限等(php.net/manual/en/function.session-regenerate-id.php)。最好不要使用标准会话,这可能在共享主机中容易受到攻击 (php.net/manual/en/function.session-set-save-handler.php)。尝试在适用的情况下散列 + salt 数据(密码等)

标签: php csrf csrf-protection


【解决方案1】:

我将向您展示我的 CSRF 预防代码:

config.php
应该使用requireinclude 函数在每个页面中自动加载配置文件。
最佳实践是编写一个配置类(我只是写下函数以简化我的代码)。

session_start();

if(empty($_SESSION['CSRF'])){
        $_SESSION['CSRF'] = secureRandomToken();
    }

post.php
这只是一个例子。在每个“发布”页面中,您应该检查是否设置了 CSRF 令牌。请使用POST 方法提交您的表格!我还建议您查看Slim FrameworkLaravel Lumen,它们提供了一个出色的路由系统,可以让您非常轻松地仅在“post.php”页面上接受 POST 请求(它们也会自动在每种形式中添加一个 CSRF 令牌)。

if (!empty($_POST['CSRF'])) {
    if (!hash_equals($_SESSION['CSRF'], $_POST['CSRF'])) {
        die('CSRF detected.');
    }
}else{
    die('CSRF detected.');
}

view.php
现在您只需在其中添加一个隐藏的输入,其中包含您的 CSRF 会话值。

<input type="hidden" name="CSRF" value="<?= $_SESSION['CSRF'] ?>">

我希望这个快速的解释可以帮助你:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-22
    • 2010-12-19
    • 1970-01-01
    相关资源
    最近更新 更多