表单令牌,以防止直接访问,不起作用

时间:2013-11-25 22:07:26

标签: php ajax forms security token

我想使用令牌来保护通过AJAX请求加载的页面(基本思想是阻止直接访问该页面)。到目前为止一切都很好。

问题在于两个令牌都不匹配。它不起作用。

要创建我的令牌,我使用此功能:

function generateFormToken($form) {
$token = md5(uniqid(microtime(), true));

$_SESSION[$form.'_token'] = $token;

return $token;
}

要验证它们,我使用此功能:

function verifyFormToken($form) {
if (!isset($_SESSION[$form.'_token'])) {
    return false;
}

if(!isset($_POST['token'])) {
    return false;
}

if ($_SESSION[$form.'_token'] !== $_POST['token']) {
    return false;
}

return true;
}

在我的表单中,contact_form.php我创建了我的令牌:

$newToken = generateFormToken('contactForm');

然后我将生成的令牌放入隐藏字段:

<input type="hidden" name="token" value="<?php echo $newToken; ?>" />

在我的网站标题中,我开始了一个会话:

if (session_id() === '') {
    session_start();
}

我检查是否已经有另一个会话的原因是因为在我的index.php页面上有一个cookie集(没有检查我得到一个PHP错误消息,说已经有一个会话):

if (isset($_COOKIE['ava_lastpage'])) {
$prev_page = secure($_COOKIE['ava_lastpage']);
}
// Set current page
if (!isset($_GET['task']) || (isset($_GET['task']) && $_GET['task'] != 'register' && $_GET['task'] != 'validate' && $_GET['task'] != 'login' && !isset($_GET['status']) || isset($_GET['status']) && $_GET['status'] != 'reg_complete')) {
setcookie('ava_lastpage', curPageUrl(), time()+60*60*24*100, '/');
}

这是我的AJAX请求(contact.php是应通过令牌保护的文件):

$.ajax({
type:'POST',
url: '<?php echo $setting['site_url'] .'/';?>includes/misc/contact.php',
data:$('#contactForm').serialize(),

});

在我的文件contact.php中,我尝试验证令牌(这不起作用):

if (verifyFormToken('contactForm')) {
      bla bla bla...

更新

上述功能可在Serious Form Security找到。

1 个答案:

答案 0 :(得分:1)

我认为您应该将网站的标题更改为:

session_start();