2011-09-17 58 views
0

我有一個非常簡單的驗證碼,這樣的事情:防止查詢驗證碼發生器從YSlow的

<?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做出的,不要再次生成驗證碼。

Regards, 影子。

回答

0

YSlow在運行時請求頁面組件,因此聽起來像您的問題是用戶安裝了YSlow的情況下它設置爲在每次頁面加載時自動運行。

最好的解決方案可能是調整您的驗證碼,以避免在同一會話中重新創建新值,或者確保會話變量與發送的圖像匹配。

但是,如果您想要查看接收到的HTTP標頭,則可以將YSlow檢測到的第二個查詢作爲原始問題。

我剛剛運行一個測試,發現這些頭與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]) 
)