【发布时间】: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
【问题讨论】:
-
你为什么要检查isset($_POST['from2']),在你的html代码中没有名字from2这样的输入。