我想使用令牌来保护通过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找到。
答案 0 :(得分:1)
我认为您应该将网站的标题更改为:
session_start();