CSRF PHP预防机制

时间:2013-09-08 00:22:19

标签: php csrf csrf-protection

我已经阅读了很多关于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?

非常感谢。

1 个答案:

答案 0 :(得分:0)

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

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

session_start();

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

post.php
这只是一个例子。在每个&#34;帖子&#34;您应该检查页面是否设置了CSRF令牌。请使用POST方法提交表单!我还建议您查看Slim FrameworkLaravel Lumen,它们提供了一个出色的路由系统,只允许您在&#34; post.php&上接受POST请求#34;页面非常容易(它们也会自动在每个表单中添加一个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'] ?>">

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