不知何故,imagepng使我的脚本运行两次。
header("Content-type: image/png");
if(isset($_GET['token'])) {
if($core->captchaTokenExists($_GET['token'])){
$token = $_GET['token'];
$captchaCode = $core->newCaptcha($token);
//Image generation
$imageWidth = 184;
$imageHeight = 70;
$image = imagecreatetruecolor($imageWidth, $imageHeight);
imagettftext($image, 13, 0, 30, 40, imagecolorallocate($image, 50, 50, 50), 'core/font/captcha.ttf', $captchaCode);
imagepng($image);
imagedestroy($image);
}
}
图像上出现的文本是使用newCaptcha($ token)随机生成的。例如,它显示“IGWVID”。但在数据库中显示“JNNYSN”。
我使用以下代码调试php代码,看看会发生什么;
file_put_contents('debug.txt', file_get_contents('debug.txt') . time() . PHP_EOL);
我收到以下输出:
1400870202
1400870202
newCaptcha($令牌):
public function newCaptcha($token) {
try {
global $Db;
$answer = $this->generateString(6);
$Db->query("UPDATE `captcha` SET `answer` = :answer WHERE `token` = :token");
$Db->bind(":answer", $answer);
$Db->bind(":token", $token);
$Db->execute();
return $answer;
} catch (Exception $e) {
$this->addToResponse('false', $e->getMessage());
}
}
generateString($长度):
public function generateString($length) {
$chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
$size = strlen( $chars );
for( $i = 0; $i < $length; $i++ ) {
@$str .= $chars[ rand( 0, $size - 1 ) ];
}
return $str;
}
为什么要这样做?
编辑:我刚发现标头导致了问题。我删除了标题,并在imagepng代码之前使captchaCode回显,它与数据库中的相同。
编辑2:这只发生在firefox中,但不会发生在chrome中。