验证码会话有时不会更新

时间:2015-06-26 16:00:12

标签: php session captcha

有时,当我刷新包含验证码图像的页面时,验证码图像会加载新字符串,但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);
}

1 个答案:

答案 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并尝试一下。如果您提交错误的验证码字符串,它会告诉您。