【问题标题】:php prevent csrf attacks in mutiple submitphp在多个提交中防止csrf攻击
【发布时间】:2014-11-29 15:25:08
【问题描述】:

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

代码:

$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

【问题讨论】:

标签: php forms


【解决方案1】:

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

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

【讨论】:

  • 你说得对。如果我为所有表单生成/发布一个 csrf 令牌,这是安全的吗?
猜你喜欢
  • 2018-08-08
  • 1970-01-01
  • 2018-01-08
  • 2012-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-26
  • 2014-01-02
相关资源
最近更新 更多