如何验证多个表单在一个页面中使用表单令牌来防止CSRF攻击?

时间:2016-05-01 12:08:25

标签: php

好吧,在我的网站中,我使用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.....
    }
}

我怎样才能解决这类问题?任何人都可以帮助我吗?谢谢。

1 个答案:

答案 0 :(得分:1)

调用生成令牌一次的功能。将返回值存储在变量中。在每种形式中使用该变量。