关于防止跨站请求伪造?

时间:2011-11-18 20:49:04

标签: php

我在互联网上找到了这几行代码,其目标是使用一次性令牌来防止CSRF。 由于隐藏的值可以很容易地从源代码中读取,我试图弄清楚是什么让这段代码阻止跨站点请求伪造?任何想法?

 **form.php** 
  <?php 
    $token = md5(uniqid(rand(), TRUE));
    $_SESSION['token'] = $token;
    ?>    
    <form action="process.php" method="post">
    <input type="hidden" name="token" value="<?php echo $token; ?>" />
    <p>
    Symbol: <input type="text" name="symbol" /><br />
    Shares: <input type="text" name="shares" /><br />
    <input type="submit" value="Buy" />
    </p>
    </form>


**process.php**
   <?php

    if ($_POST['token'] == $_SESSION['token'])
    {
        /* Valid Token */
    }

    ?>

3 个答案:

答案 0 :(得分:0)

为每个响应生成令牌,攻击者通常无法访问被攻击页面的内容。

答案 1 :(得分:0)

CSRF的想法是用户无法做他不打算做的动作。

例如,用户可以在wordpress网站上以管理员身份登录,而他的登录有效则会浏览到其他网站,其中包含用于更改用户wordpress网站密码的恶意代码。

由于登录有效(会话存在),请求会通过用户验证,但会失败,因为它缺少该特定操作的令牌(每次查看表单时都会生成该令牌)。

答案 2 :(得分:0)

为每个会话唯一生成令牌并将其存储到全局会话变量中。当攻击者通过iframe或他们使用的任何形式的攻击访问站点时,[希望]生成的令牌将与存储在DB中的令牌(在这种情况下,发布到process.php)不匹配。由于令牌不匹配,攻击者将无法访问process.php中if语句中的内容。