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


Session Variable fails when generated through IMG tag

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

在主索引页的顶部附近有一个session_start();。表单页面是通过include()在索引的中途加载的。

在表单中,captcha通过以下行加载:

<img src="generatedice.php" alt="captcha" height="50px"/>

脚本generatedice.php生成随机数并显示骰子的png。然后创建会话一个会话变量。

if (session_status() == PHP_SESSION_NONE) {  
    session_start();
}
    $_SESSION['total']=md5(SECRET+$total);
    header('Content-type: image/png');
    imagepng($img);
    imagedestroy($img);

在表单的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:

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

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

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

echo '<img src="generatedice.php?r='.time().'" alt="captcha" height="50px"/>';

这将避免浏览器缓存图像,因为url会因秒而异。


如果你在试图处理答案的同一页面上包含图像,那么在检查第一个之前,你也可能实际上是在将会话更新为新的Captcha。

尝试排除图像,如果已经给出了答案,看看是否是这样:

  if (!isset($_REQUEST["answerswer"])){
     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";
     }
   }