好吧,在我的网站中,我使用PHP独特的表单令牌来防止CSRF攻击。唯一的表单标记和表单标记验证功能如下:
// generate new token for every form
function generate_Form_Token($form_name) {
$token = md5(uniqid(microtime(), true));
$_SESSION[$form_name.'_token'] = $token;
return $token;
}
// validate form request
function verifyForm ($form, $url){
// call the form processing page
$actual_link = "http://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
if($actual_link !== SITE_URL."$url")
return false;
if(isset($_SERVER['HTTP_X_REQUESTED_WITH']) && empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) !== 'xmlhttprequest')
return false;
if(!isset($_SESSION[$form.'_token']))
return false;
if(!isset($_POST['_token']))
return false;
if($_SESSION[$form.'_token'] !== $_POST['_token'])
return false;
return true;
}
现在如果我在一个页面中有一个表单,那么它就可以成功验证表单。
但是在我的网站上我有一个名为create-menu.php
的页面我在这里使用4表单所以这个4表单将生成4个唯一的表单令牌,我使用以下输入字段到每4个形式:
<input type="hidden" name="_token" value="<?php echo generate_Form_Token('menu_creation'); ?>">
但问题是我在process.php
页面中验证表单(使用Ajax)。在此页面中,只有第一个表单正在验证,但其他3表单显示错误消息(如果表单令牌与会话不匹配,则为我的自定义错误消息)。
process.php页面
if($_SERVER['REQUEST_METHOD'] == 'POST') {
if(verifyForm('menu_creation','menu-creation')) {
// my code.....
}
}
我怎样才能解决这类问题?任何人都可以帮助我吗?谢谢。
答案 0 :(得分:1)
调用生成令牌一次的功能。将返回值存储在变量中。在每种形式中使用该变量。