ボタン付きのシンプルなフォームがあります。ボタンを押すと、PHP ページで GET が呼び出されます。ページには IMG タグのみがあり、SRC は PNG 画像を動的に返す PHP スクリプトです (imagepng()
関数)。
Internet Explorer 9 がこのイメージを複数回ロードするのはなぜですか?
これが起こっていることを確認するのは少し難しいかもしれません。これを発見したのは、PHP スクリプト (PNG を生成するスクリプト) を PHPEd でデバッグしていて、フローがファイルに 2 回入り、ブレークポイントで 2 回停止していることに気付いたからです。
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>
ファイル「verification.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 フォントが 1 つ必要です。フォントファイルと同じフォルダーに置き、上記のスクリプトの $font 変数を変更します。任意の True Type フォントを使用できます。以下をご覧ください。
$font = "arial.ttf";
唯一の要件は、すべてをよりシンプルにするために、ttf ファイルがスクリプトと同じフォルダーにある必要があることです。
正しい動作をテストするには:
- Internet Explorer で「teste.php」ファイルを開きます。
- ブラウザの更新ボタンを数回押します。
- 動的に作成された「teste.txt」という名前のファイルを調べてください。
結果: ファイルには 1 行しかありません。内容は、キャプチャ画像に表示された正しい合計値を示しています。これは正しい動作です。なぜなら、verification.php はキャプチャ イメージの表示時に 1 回だけ呼び出されるからです。
次に、問題をテストします。
- Internet Explorer で「teste.php」ファイルを開きます。
- 「GO!」を押してください。ボタンを何度か押します。3x で十分です。
- 動的に作成された「teste.txt」という名前のファイルを調べてください。
結果: ファイルに複数の行があります。おそらく2.そのうちの1つがキャプチャ画像合計の正解を持っています。画像を作成するためのこれら 2 つの呼び出しは、キャプチャ システムに対する正しい答えを台無しにしているため、Internet Explorer で使用する方法はありません。
IE でこれを回避するにはどうすればよいですか? Firefox ではすべて問題ありません。
PS .: Lime Survey PHP Scriptのキャプチャ システムを使用しようとしていますが、上記の問題により IE では機能しません。