【问题标题】:prevent query to captcha generator from YSlow防止从 YSlow 查询验证码生成器
【发布时间】:2011-12-29 02:44:57
【问题描述】:

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

<?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 进行的,以不再生成验证码。

问候, 影子。

【问题讨论】:

    标签: php session captcha yslow


    【解决方案1】:

    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])
    )

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-15
      • 1970-01-01
      • 1970-01-01
      • 2013-07-26
      • 1970-01-01
      相关资源
      最近更新 更多