我使用此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
答案 0 :(得分:1)
确保您只拨打NoCSRF::generate()
一次。如果多次调用它,旧令牌的数据将被覆盖,使其无效。
或者,为两个令牌使用不同的密钥(而不是使用"csrf_token"
)。