0

我有一个非常简单的验证码,如下所示:

<?php
    session_start();
    function randomText($length) {
        $pattern = "1234567890abcdefghijklmnopqrstuvwxyz";
        for($i=0;$i<$length;$i++) {
            $key .= $pattern{rand(0,35)};
        }
        return $key;
    }
    $textCaptcha=randomText(8);
    $_SESSION['tmptxt'] = $textCaptcha;
    $captcha = imagecreatefromgif("bgcaptcha.gif");
    $colText = imagecolorallocate($captcha, 0, 0, 0);
    imagestring($captcha, 5, 16, 7, $textCaptcha, $colText);

    header("Content-type: image/gif");
    imagegif($captcha);
?>

问题是,如果用户安装了 YSlow,图像会被查询 2 次,因此,验证码会重新生成,并且永远不会与用户插入的验证码匹配。

我看到如果我将内容类型标头作为 gif 传递,那只是第二次查询,如果我将其打印为普通 php,则不会发生这种情况。

有人对此有任何线索吗?我如何防止它或确定第二个查询是由 YSlow 进行的,以便不再生成验证码。

问候,影子。

4

1 回答 1

0

YSlow 在运行时确实会请求页面组件,因此听起来您的问题是用户安装了 YSlow并且设置为在每次页面加载时自动运行的情况。

最好的解决方案可能是调整您的验证码以不在同一会话中重新创建新值,或者确保会话变量与发送的图像匹配。

但是对于您关于检测 YSlow 进行的第二个查询的原始问题,如果您查看收到的 HTTP 标头,则有可能。

我刚刚进行了测试,发现这些标头是随 YSlow 请求发送的。User-Agent 设置为与浏览器匹配(在我的情况下为 Firefox),但您可以检查是否存在X-YQL-Depth作为信号。(YSlow对其所有请求都使用YQL 。)

Array
(
    [Client-IP] => 1.2.3.4
    [X-Forwarded-For] => 1.2.3.4,  5.6.7.8
    [X-YQL-Depth] => 1
    [User-Agent] => Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:8.0.1) Gecko/20100101 Firefox/8.0.1
    [Accept-Encoding] => gzip
    [Host] => www.example.com
    [Connection] => keep-alive
    [Via] => HTTP/1.1 htproxy1.ops.sp1.yahoo.net[D1832930] (YahooTrafficServer/1.19.5 [uScM])
)
于 2011-12-28T18:44:57.727 回答