php防止多次提交中的csrf攻击

时间:2014-10-04 23:17:57

标签: php forms

我使用此PHP class来防止CSRF受到攻击。

CODE:

$token = NoCSRF::generate( 'csrf_token' );

<form name="csrf_form" action="#" method="post">
    <input type="hidden" name="csrf_token" value="<?php echo $token; ?>">
    ...Other form inputs...
    <input type="submit" value="Send form">
</form>

检查csrf:

try
{
    // Run CSRF check, on POST data, in exception mode, with a validity of 10 minutes, in one-time mode.
    NoCSRF::check( 'csrf_token', $_POST, true, 60*10, false );
    // form parsing, DB inserts, etc.
}
catch ( Exception $e )
{
    // CSRF attack detected
}

当我在我的页面中有一个时,这对我有用但是当我在我的页面中有两个表单时,只使用一个表单并以其他形式提交始终显示CSRF attack detected

php检查表格1:

if($_POST['submit'] == "from") && !empty($_POST['username'])){

   try
      {
        // Run CSRF check, on POST data, in exception mode, with a validity of 10 minutes, in one-time mode.
        NoCSRF::check( 'csrf_token', $_POST, true, 60*10, false );
        // form parsing, DB inserts, etc.
    }
    catch ( Exception $e )
    {
        // CSRF attack detected
    }
}

php检查表格2:

if($_POST['submit'] == "from2") && !empty($_POST['username'])){

   try
      {
        // Run CSRF check, on POST data, in exception mode, with a validity of 10 minutes, in one-time mode.
        NoCSRF::check( 'csrf_token', $_POST, true, 60*10, false );
        // form parsing, DB inserts, etc.
    }
    catch ( Exception $e )
    {
        // CSRF attack detected
    }
}

HTML表格:

 <form name="csrf_form" action="#" method="post">
             <?PHP $token = NoCSRF::generate( 'csrf_token' );?>
            <input type="hidden" name="csrf_token" value="<?php echo $token; ?>">
            <input type="text" name="username">
            <input type="submit" value="form">
        </form>
    <form name="csrf_form" action="#" method="post">
             <?PHP $token = NoCSRF::generate( 'csrf_token' );?>
            <input type="hidden" name="csrf_token" value="<?php echo $token; ?>">
            <input type="text" name="badname">
            <input type="submit" value="form2">
    </form>

如何解决这个问题?如何将这个类用于多个表单?!

班级来源here

1 个答案:

答案 0 :(得分:1)

确保您只拨打NoCSRF::generate()一次。如果多次调用它,旧令牌的数据将被覆盖,使其无效。

或者,为两个令牌使用不同的密钥(而不是使用"csrf_token")。