【问题标题】:CSRF code not workingCSRF 代码不起作用
【发布时间】:2023-03-04 05:55:01
【问题描述】:

我正在阅读 Chris Shifflet 所著的“Essential PHP Security”一书。 CSRF中有一章,作者推荐使用token来防止CSRF。书中的代码说要在我们使用的表单中添加一个令牌

<?php

session_start();
$token = md5(uniqid(rand(), TRUE));
$_SESSION['token'] = $token;
$_SESSION['token_time'] = time();

?>

<form action="buy.php" method="POST">
<input type="hidden" name="token" value="<?php echo $token; ?>" />
<p>
Item:
<select name="item">
    <option name="pen">pen</option>
    <option name="pencil">pencil</option>
</select><br />
Quantity: <input type="text" name="quantity" /><br />
<input type="submit" value="Buy" />
</p>
</form>

并且可以使用简单的条件语句检查令牌。

<?php

if (isset($_SESSION['token']) && $_POST['token']== $_SESSION['token'])
    {
        echo $_POST['token'];
        echo "form passed";
    }

但上面的代码似乎不起作用。 “表单已通过”消息未显示。上面的代码有什么问题?第一组代码生成令牌,但没有成功消息。

【问题讨论】:

    标签: php csrf


    【解决方案1】:

    您需要在buy.php 中的代码顶部添加session_start();。示例...

    session_start();
    if (isset($_SESSION['token']) && $_POST['token']== $_SESSION['token'])
    {
        echo $_POST['token'];
        echo "form passed";
    }
    

    【讨论】:

    • 谢谢。有效。想知道为什么他们出版的书有这么多错误。再次感谢您。
    【解决方案2】:

    我会建议你以功能高效的方式来做:

    session_start();
     function generate_token(){
        $token = uniqid(rand(), true);
        $_SESSION['token'] = $token;
        $_SESSION['token_time'] = time();
     }
    
    
     //avoid putting script at bottom until required
    if($_SERVER['REQUEST_METHOD']=='POST' && !empty($_POST)){
    if(isset($_SESSION['token']) && isset($_SESSION['token_time']) && 
     isset($_POST['token']))
      {
    
     if($_SESSION['token'] == $_POST['token'])
     {
    
        $timestamp_ancien = time() - (15*60);
        //Si le jeton n'est pas expiré
        if($_SESSION['token_time'] >= $timestamp_ancien)
        {
            //here Instruction  
            generate_token();//for next call
    
    
         }else{echo"error3";}
        }else{echo"error2";}
        }else{echo"error1";}
    }
    generate_token();
    

    原因:您可以将该函数放在项目中常见的任何位置,并包含或要求该文件使用该代码,而无需在任何地方编写它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-28
      • 2015-05-07
      • 2015-04-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多