Php 通过IMG标记生成会话变量时失败

Php 通过IMG标记生成会话变量时失败,php,session-variables,Php,Session Variables,我有一个生成骰子图像的验证码和一个会话变量。它在实时服务器上随机失败,但在开发盒上从不失败。我不确定是会话变量有问题还是下面调用的header()有问题。也许是两者的结合 在主索引页的顶部附近有一个会话_start()。表单页面通过include()加载到索引的中间 在表单中,验证码通过以下行加载: <img src="generatedice.php" alt="captcha" height="50px"/> 在表单的POST文件中,通过以下方式检查变量: if (md5(SE

我有一个生成骰子图像的验证码和一个会话变量。它在实时服务器上随机失败,但在开发盒上从不失败。我不确定是会话变量有问题还是下面调用的header()有问题。也许是两者的结合

在主索引页的顶部附近有一个
会话_start()。表单页面通过include()加载到索引的中间

在表单中,验证码通过以下行加载:

<img src="generatedice.php" alt="captcha" height="50px"/>
在表单的POST文件中,通过以下方式检查变量:

if (md5(SECRET+$_REQUEST['answer'])==$_SESSION['total']) { 
当我回显POST文件中的两个变量时,它们通常是不同的

eccbc87e4b5ce2fe28308fd9f2a7baf3 VS a87ff679a2f3e71d9181a67b7542122c
那么,托管公司处理会话头的方式是否有所不同?我有点困惑,想知道该检查什么

编辑:
我认为这可能是与会话页面加载相关的问题。如果我是对的,图像将在索引页之后呈现。所以他们最终可能是不同的会议?但是我怎么能修好呢

编辑2: 这也可能是相关的。它是主索引开头的代码

ob_start(); 
header('Cache-Control: max-age=604800');
session_start();

// Regenerate the Session for Security
if (!isset($_SESSION['regen'])) 
{ 
   session_regenerate_id(); 
   $_SESSION['regen'] = true; 
}
编辑3:


为了记录在案,我已经完全删除了这个验证码过程,并将其替换。但我仍然好奇它是如何被修复的。

我认为实际的问题是生成的图像被浏览器“缓存”了。因此,它将从缓存中重新使用,并且会话变量从未设置(或保持在其第一个状态),因为脚本从未被调用,即使图像显示给用户时也是如此

尝试使用PHP生成img标记,并附加一个随机参数,以确保客户端浏览器再次调用脚本文件,从而在每次请求时刷新会话变量

echo '<img src="generatedice.php?r='.time().'" alt="captcha" height="50px"/>';
echo';
这将避免浏览器缓存图像,因为url每秒都不同


如果您在试图处理答案的同一页面上包含图像,也可能在检查第一个验证码之前,您正在将会话更新为新的验证码

如果给出了答案,请尝试排除图像,以查看是否存在这种情况:

  if (!isset($_REQUEST["answer"])){
     echo '<img src="generatedice.php?r='.time().'" alt="captcha" height="50px"/>';
   }else{
     if (md5(SECRET+$_REQUEST['answer'])==$_SESSION['total']) { 
       echo "Your answer was correct";
     }else{
       echo "Your answer was wrong";
     }
   }
if(!isset($\u请求[“应答])){
回声';
}否则{
如果(md5(机密+$\u请求['answer'])=$\u会话['total']){
echo“你的回答是正确的”;
}否则{
回声“你的答案是错误的”;
}
}

您是否将
SECRET+$\u请求['answer']
SECRET+$total
进行了比较?(不是MD5哈希,而是实际字符串本身)是的,它们也不匹配。表单编号是正确的,但生成的表单编号不知为何是错误的。如果您摆脱了围绕
会话的条件包装\u start()
,会发生什么?(我这样问是因为通常我看到每次调用
session\u start()
的实现,即使会话是在另一个请求中启动的;在这种情况下,会话只会恢复。)您也在处理POST的文件中使用
session\u start()
,对吗?你有没有检查过实际的会话总数,看看它是怎么说的?(使用更完整的代码可能会更容易,因为有很多未知因素。)@Maelish,嘿,伙计。你设法解决了这个问题吗?我想知道,因为我面临着同样的问题。这两个问题我都试过了,但都没有成功-(如果我将
generatedice.php
文件改为函数,我会遇到同样的问题吗?
  if (!isset($_REQUEST["answer"])){
     echo '<img src="generatedice.php?r='.time().'" alt="captcha" height="50px"/>';
   }else{
     if (md5(SECRET+$_REQUEST['answer'])==$_SESSION['total']) { 
       echo "Your answer was correct";
     }else{
       echo "Your answer was wrong";
     }
   }