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

时间:2014-10-09 16:07:07

标签: php session-variables

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

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

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

<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:

为了记录,我已完全删除了此验证码流程并将其替换。但我仍然对如何修复它感到好奇。

1 个答案:

答案 0 :(得分:1)

我认为实际问题是所生成的图像已被缓存&#34;通过浏览器。因此它将从缓存中重用,并且Session变量永远不会设置(或保持其第一个状态),因为即使向用户显示图像,也不会调用脚本。

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

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

这样可以避免浏览器缓存图像,导致网址从秒到秒不同。


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

尝试排除图像,如果已给出答案以确定是否是这种情况:

  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";
     }
   }