Php 用于防止直接访问的表单令牌不起作用

Php 用于防止直接访问的表单令牌不起作用,php,ajax,forms,security,token,Php,Ajax,Forms,Security,Token,我想使用令牌来保护通过AJAX请求加载的页面(基本思想是防止直接访问该页面)。到目前为止还不错 问题是两个令牌不匹配。它不起作用 要创建我的令牌,我使用此函数: function generateFormToken($form) { $token = md5(uniqid(microtime(), true)); $_SESSION[$form.'_token'] = $token; return $token; } function verifyFormToken($form) { if

我想使用令牌来保护通过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;
}
要验证它们,我使用此功能:

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; ?>" />
我之所以要检查是否已经有另一个会话,是因为在我的index.php-page上有一个cookie集(如果没有检查,我会收到一条php错误消息,说已经有一个会话):

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

更新
上面提到的功能可以在上找到。

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


session_start()

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



session_start()

从所有基本调试内容开始。1) 检查错误日志2)
print\r($\u会话);打印(邮政美元)3)打开FireBug并检查AJAX请求/响应头以查看Cookie在做什么。谢谢!我去看看!在我的页面contact.php上,我无法访问superglobal$\会话的令牌。没有…检查以确保cookie已设置。下载FireFox,安装Firebug,然后检查“cookies”选项卡和“NET”选项卡以查看设置cookies的标题。cookie已设置。这是我检查的第一件事。顺便说一句:它现在似乎工作-我的网站的结构是问题所在。每次我请求contact.php时,都会创建一个新的令牌,这就是它们不匹配的原因!本主题帮助很大:从所有基本调试内容开始。1) 检查错误日志2)
print\r($\u会话);打印(邮政美元)3)打开FireBug并检查AJAX请求/响应头以查看Cookie在做什么。谢谢!我去看看!在我的页面contact.php上,我无法访问superglobal$\会话的令牌。没有…检查以确保cookie已设置。下载FireFox,安装Firebug,然后检查“cookies”选项卡和“NET”选项卡以查看设置cookies的标题。cookie已设置。这是我检查的第一件事。顺便说一句:它现在似乎工作-我的网站的结构是问题所在。每次我请求contact.php时,都会创建一个新的令牌,这就是它们不匹配的原因!这个主题帮助很大:我已经这样做了,然后我收到一条错误消息说已经有一个会话(通过cookie)。contact.php中是否也调用了
session\u start()
?否。我在contact.php中添加了它,现在我得到了一个不同的令牌。这就是它不起作用的原因。当我在表单上回显两个令牌时,它们是相等的(惊喜),但在contact.php文件中,令牌$\u会话['contactForm\u token']是不同的。我是否必须在表单上或会话_start()下的index.php上生成令牌?是的,您只能在session_start()调用之后修改session变量。嗯……现在似乎可以了。那是因为我改变了我网站的结构。好奇的是:在我创建一个新的令牌之前,我必须检查令牌是否已经存在吗?我已经这样做了,然后我收到一条错误消息,说已经有一个会话(通过cookie)。在contact.php中也调用了
session\u start()
?没有。我在contact.php中添加了它,现在我得到了一个不同的令牌。这就是它不起作用的原因。当我在表单上回显两个令牌时,它们是相等的(惊喜),但在contact.php文件中,令牌$\u会话['contactForm\u token']是不同的。我是否必须在表单上或会话_start()下的index.php上生成令牌?是的,您只能在session_start()调用之后修改session变量。嗯……现在似乎可以了。那是因为我改变了我网站的结构。只是好奇:在我创建一个新的令牌之前,我是否必须检查令牌是否已经存在?
$.ajax({
type:'POST',
url: '<?php echo $setting['site_url'] .'/';?>includes/misc/contact.php',
data:$('#contactForm').serialize(),

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