有时,当我刷新包含验证码图像的页面时,验证码图像会加载新字符串,但session
包括验证码刺激,不会更新!
例如,首先,我的验证码图片显示abcde
。接下来,我刷新页面,验证码图像显示vwxyz
作为新的验证码,并定期将$_SESSION['rand_code']
的值替换为vwxyz
$_SESSION['rand_code']
。但abcde
具有相同的值<?php
if(!session_id() || session_id() == ''){ // i used this because i have started a session before
session_start();
}
$string = '';
for ($i = 0; $i < 5; $i++) {
$string .= chr(mt_rand(97, 122));
}
$_SESSION['rand_code'] = $string;
$dir = 'fonts/';
$image = imagecreatetruecolor(80, 29);
$black = imagecolorallocate($image, 0, 0, 0);
$color = imagecolorallocate($image, 0, 100, 90); // red
$white = imagecolorallocate($image, 255, 255, 255);
imagefilledrectangle($image,0,0,299,99,$white);
imagettftext ($image, 21, 8, 16, 23, $color, $dir."Havana.ttf", $_SESSION['rand_code']);
header("Content-type: image/png");
imagepng($image);
?>
注意:此问题发生的次数为10%。
catpcha.php:
<img src="captcha.php?e=<?php echo time() ?>">
调用验证码图片:
for (Object record : result) {
Object[] fields = (Object[]) record;
String id = (String) fields[0];
String name = (String) fields[1];
System.out.printf("id: %s, name: %s%n", id, name);
}
答案 0 :(得分:2)
我猜你正在从正在加载$_SESSION['rand_code']
资源的页面中检查<img>
,在这种情况下,你可能会遇到10%边际内的竞争条件,请求在从会话中提取代码的请求之后更新会话。
请记住,在PHP中,默认会话处理程序将阻止。因此,同时使用相同会话的两个请求将导致第一个请求获取会话锁定,而每个后续请求在能够访问会话之前等待该锁定被释放。在本地环境开发中,客户端和服务器之间几乎没有延迟,因此您很可能首先加载调用captcha.php
的页面,然后加载captcha.php
。
同样,这一切都假设您在同一个脚本中执行类似echo $_SESSION['rand_code']
的操作<img src="captcha.php?e=<?php echo time() ?>">
因此,如果您实际上使用上述方法检查会话变量并将其与显示的验证码图像进行比较,则可能会遇到此无序状况。相反,你想尝试这种方法(你应该发现你的会话变量根本不是不同步的)......
在脚本中创建一个表单(比如说它叫index.php)......
<form method="post" action="submit.php">
<input type="text" name="captchaString" />
<input type="submit" />
</form>
<img src="captcha.php?e=<?=time()?>">
现在,使用以下内容创建submit.php脚本...
<?php
session_start(); // always start the session first
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
// if the user POSTs let's check the captcha string against the session
if (isset($_POST['captchaString']) && $_POST['captchaString'] === $_SESSION['rand_code']) {
echo "<h1>Success!</h1>";
} else {
?>
<h1>Failure...</h1>
<p>
Captcha was '<strong><?=$_SESSION['rand_code']?></strong>' and you provided
'<strong><?=$_POST['captchaString']?></strong>'
</p>
<?php
}
} else {
// go back to form with captcha and try again
header('Location: /index.php');
}
将表单加载到index.php
并尝试一下。如果您提交错误的验证码字符串,它会告诉您。