0

我有一个带有按钮的简单表单。按下按钮在 PHP 页面上调用 GET。在页面上只有一个 IMG 标签,其中 SRC 是一个 PHP 脚本,它动态返回一个 PNG 图像(imagepng()函数)。

为什么 Internet Explorer 9 多次加载此图像?

验证是否发生这种情况可能有点棘手。我发现这一点是因为我正在使用 PHPEd 调试一个 PHP 脚本(生成 PNG 的那个),并意识到流程在文件中输入了两次,在我的断点处停止了两次!

当我查看 IE 的网络日志并看到确实有不止一个脚本调用时,我证实了这一点。要查看网络日志,请在 IE 窗口中按 F12 并单击“网络”选项卡。

根据日志,有一个调用没有完全完成(不返回 HTTP 200 状态),但这足以搞砸一切。

有关如何解决此问题的任何建议?

我已经做了一些示例脚本来演示这个问题:

文件“teste.php”

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
  <head>
    <title>Problem</title>
  </head>
  <body>
<?php 
  $handle = fopen("teste.txt", "w");
  fclose($handle);  
?>
    <img src="verification.php" alt="captcha">
    <form action="teste.php" method="get">
      <input type="submit" value="Go!">
    </form>
  </body>
</html>

文件“验证.php”

<?php
  $im = imagecreatetruecolor(75, 20);
  $black = ImageColorAllocate($im, 0, 0, 0);
  $red = ImageColorAllocate($im, 255, 0, 0);
  $blue = ImageColorAllocate($im, 0, 0, 255);
  $grey_shade = ImageColorAllocate($im, 204, 204, 204);

  srand((double)microtime()*1000000);

  $num1 = rand(1,5);

  $found = false;

  while (!$found) {
    $num2 = rand(1,100);

    if (preg_match('/^[0-9]+$/', $num2/5)) {
      $found = true;
      break;
    }
  }

  $font_c_rand = rand(1,3);

  if ($font_c_rand == 1) {
    $font_color = $black;
  } else if ($font_c_rand == 2) {
    $font_color = $red;
  } else if ($font_c_rand == 3) {
    $font_color = $blue;
  }

  $font = "vera.ttf";

  $line_rand = rand(1,3);

  if ($line_rand == 1) {
    $line_color = $black;
  } else if ($line_rand == 2) {
    $line_color = $red;
  } else if ($line_rand == 3) {
    $line_color = $blue;
  }

  ImageFill($im, 0, 0, $grey_shade);
  imageline($im,0,0,0,20,$line_color);
  imageline($im,74,0,74,19,$line_color);
  imageline($im,0,0,74,0,$line_color);
  imageline($im,0,19,74,19,$line_color);
  ImageTTFText($im, 10, 0, 3, 15,$font_color, $font,  $num1." + ".$num2." =" );


  imagepng($im);
  imagedestroy($im);

  $handle = fopen("teste.txt", "a");
  fwrite($handle, "\"verification.php\ executed!". The sum result is " . ($num1 + $num2) ."\n");
  fclose($handle);  
?>

如您所见,您将需要一种 ttf 字体。将字体文件放在同一个文件夹中,并在上面的脚本中更改 $font 变量。您可以使用任何 True Type 字体,看看:

$font = "arial.ttf";

唯一的要求是 ttf 文件必须在脚本的同一文件夹中,以使一切变得更简单。

要测试正确的行为:

  1. 在 Internet Explorer 上打开文件“teste.php”;
  2. 按几次浏览器上的刷新按钮;
  3. 查看动态创建的名为“teste.txt”的文件。

结果:文件中只有一行。内容显示验证码图像上显示的正确总和值。这是正确的行为,因为在显示验证码图像时仅调用了一次 verify.php。

现在,测试问题:

  1. 在 Internet Explorer 上打开文件“teste.php”;
  2. 按“开始!” 表单上的按钮有时。3x就够了;
  3. 查看动态创建的名为“teste.txt”的文件。

结果:文件中有不止一行。可能是 2。其中一个有验证码图像总和的正确答案。这两个创建图像的调用弄乱了验证码系统的正确答案,因此无法在 Internet Explorer 中使用它。

如何为 IE 解决这个问题?在 Firefox 中一切正常!

PS.:我正在尝试使用Lime Survey PHP Script 的验证码系统,但由于上述问题,它不适用于 IE。

4

0 回答 0