PHP表单密钥错误

PHP表单密钥错误,php,forms,session,function,hash,Php,Forms,Session,Function,Hash,有人能看看我下面的两个功能并建议我能做什么吗?我已经创建了两个函数,它们基本上创建了一个唯一的键,这个键在表单的一个隐藏字段中回响,然后在我检查表单是否已提交之后,第二个函数检查隐藏字段中的键是否与会话中的键匹配 我现在遇到的问题是,虽然我没有特意使用Firefox web开发工具编辑表单密钥进行测试,但它只是将我重定向到禁止页面,表明密钥不匹配 我不确定这是否是缓存问题,是否有人能看到我遗漏了什么或可以改进的地方?这只会偶尔发生,例如,如果我提交表单几次,它可能会转到禁止页面,这表明隐藏字段中

有人能看看我下面的两个功能并建议我能做什么吗?我已经创建了两个函数,它们基本上创建了一个唯一的键,这个键在表单的一个隐藏字段中回响,然后在我检查表单是否已提交之后,第二个函数检查隐藏字段中的键是否与会话中的键匹配

我现在遇到的问题是,虽然我没有特意使用Firefox web开发工具编辑表单密钥进行测试,但它只是将我重定向到禁止页面,表明密钥不匹配

我不确定这是否是缓存问题,是否有人能看到我遗漏了什么或可以改进的地方?这只会偶尔发生,例如,如果我提交表单几次,它可能会转到禁止页面,这表明隐藏字段中的键与会话中的键不匹配,尽管我认为我的两个函数没有任何错误

这是我的第一个函数,它创建了一个唯一的键,并在表单中的一个隐藏字段中进行了回显。我对用户提交表单的时间也有一个时间限制,但我现在已经对此进行了评论,因为启用表单后,这种情况似乎更常见

function GenerateFormTokenHash($token) { $token = $_SESSION['token'] = md5(uniqid(mt_rand(), true)); //$token_time = $_SESSION['token_time'] = time(); return htmlspecialchars($token); //return $token_time; } 函数GenerateFormTokenHash($token) { $token=$_会话['token']=md5(uniqid(mt_rand(),true)); //$token\u time=$\u会话['token\u time']=time(); 返回htmlspecialchars($token); //返回$token\u时间; } 要使用上面的函数,我只需回显GenerateFormTokenHash($token);在一个被称为令牌的隐藏文件中

在我检查表单是否已提交后,将直接使用下面的函数

# Form Token Hash Validator function IsValidFormTokenHash() { /*global $websiteaddress; $token_age = time() - $_SESSION['token_time']; if($token_age >= 300) { echo 'Session Expired'; echo 'This form has now expired. '; echo 'Please click here to go back to the form.'; $_SESSION = array(); setcookie(session_name(), '', time()-42000, '/'); # Destroy the session session_destroy(); # Generate new seesion id session_regenerate_id(true); exit; }*/ if(isset($_POST['token']) && $_POST['token'] != $_SESSION['token'] || !isset($_POST['token']) || !isset($_SESSION['token'])) { $_SESSION = array(); setcookie(session_name(), '', time()-42000, '/'); # Destroy the session session_destroy(); # Generate new seesion id session_regenerate_id(true); redirect("/error/forbidden.php"); exit; } } #表单令牌哈希校验器 函数对MTokenhash()有效 { /*全球$网址; $token_age=time()-$_会话['token_time']; 如果($token_age>=300){ echo“会话已过期”; echo“此表单现已过期”; echo“请单击此处返回表单”; $\会话=数组(); setcookie(session_name(),“”,time()-42000,“/”); #销毁会话 会话_destroy(); #生成新seision id 会话\u重新生成\u id(true); 出口 }*/ 如果(isset($_POST['token'])和&$_POST['token']!=$_会话['token']| |!isset($_POST['token'])| | |!isset($_会话['token'])) { $\会话=数组(); setcookie(session_name(),“”,time()-42000,“/”); #销毁会话 会话_destroy(); #生成新seision id 会话\u重新生成\u id(true); 重定向(“/error/probled.php”); 出口 } } 同样,该函数位于我的functions.php文件中,因此在检查表单是否已提交后,我只需按如下方式调用该函数:

if(isset($_POST['submit'])) { IsValidFormTokenHash(); } 如果(isset($_POST['submit'])){ IsValidFormTokenHash(); }
所以我基本上是想弄清楚为什么有时它只是认为会话密钥和隐藏字段中的密钥不匹配,可能是缓存问题,或者我可以做些什么来确保它正常工作?

可能你需要的是在
周围加上括号,如果
检查部分,他们可能会以另一种方式得到评估,而不是您的逻辑需求:

if( (isset($_POST['token']) && $_POST['token'] != $_SESSION['token']) //<-- added parenthesis around those
  || !isset($_POST['token'])
  || !isset($_SESSION['token']))

if((设置($\u POST['token'])和&$\u POST['token'])!=$\u SESSION['token'])/“非常好。”我同意。谢谢aularon似乎没事,非常感谢您的时间和帮助:)