我有一个带有按钮的简单表单。按下按钮在 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 文件必须在脚本的同一文件夹中,以使一切变得更简单。
要测试正确的行为:
- 在 Internet Explorer 上打开文件“teste.php”;
- 按几次浏览器上的刷新按钮;
- 查看动态创建的名为“teste.txt”的文件。
结果:文件中只有一行。内容显示验证码图像上显示的正确总和值。这是正确的行为,因为在显示验证码图像时仅调用了一次 verify.php。
现在,测试问题:
- 在 Internet Explorer 上打开文件“teste.php”;
- 按“开始!” 表单上的按钮有时。3x就够了;
- 查看动态创建的名为“teste.txt”的文件。
结果:文件中有不止一行。可能是 2。其中一个有验证码图像总和的正确答案。这两个创建图像的调用弄乱了验证码系统的正确答案,因此无法在 Internet Explorer 中使用它。
如何为 IE 解决这个问题?在 Firefox 中一切正常!
PS.:我正在尝试使用Lime Survey PHP Script 的验证码系统,但由于上述问题,它不适用于 IE。