2014-10-09 41 views
1

我有一個驗證碼可以生成骰子圖像和會話變量。它在活動服務器上隨機失敗,但從未在開發框中執行。我不確定會話變量是否存在問題,或者下面調用了header()。也許這兩者的組合?通過IMG標記生成會話變量失敗

在主索引頁面的頂部附近有一個session_start();。表單頁面通過include()在索引中間加載。

在表單中,驗證碼是通過這條線加載:

<img src="generatedice.php" alt="captcha" height="50px"/> 

腳本generatedice.php生成隨機數,並顯示骰子的PNG圖像。然後創建會話一個​​會話變量。

if (session_status() == PHP_SESSION_NONE) { 
    session_start(); 
} 
    $_SESSION['total']=md5(SECRET+$total); 

    header('Content-type: image/png'); 
    imagepng($img); 
    imagedestroy($img); 

在窗體的POST文件中的變量通過這個檢查:

if (md5(SECRET+$_REQUEST['answer'])==$_SESSION['total']) { 

當我附和POST文件中的兩個變量,他們通常是不同的。

eccbc87e4b5ce2fe28308fd9f2a7baf3 VS a87ff679a2f3e71d9181a67b7542122c 

那麼託管公司處理會話標題的方式不同嗎?我有點困惑,很想知道要檢查什麼。

編輯:
我認爲這可能是一個會話頁面加載相關的問題。如果我是對的,圖像會在索引頁面之後呈現。所以他們最終可能是不同的會議?我怎樣才能修復?

編輯2: 這也可能是相關的。它的代碼在主索引的開始處。

ob_start(); 
header('Cache-Control: max-age=604800'); 
session_start(); 

// Regenerate the Session for Security 
if (!isset($_SESSION['regen'])) 
{ 
    session_regenerate_id(); 
    $_SESSION['regen'] = true; 
} 

編輯3:

爲了記錄在案,我已經完全刪除了此驗證碼進程,並取而代之。但我仍然很好奇它是如何被修復的。

+0

你有沒有比較'SECRET + $ _REQUEST [「答案」]'來'SECRET + $總'? (不是MD5哈希,而是實際的字符串本身) – 2014-10-09 16:11:58

+0

是的,它們也不匹配。表格編號是正確的,但生成的編號是錯誤的。 – Maelish 2014-10-09 16:33:48

+0

如果你擺脫了環繞'session_start()'的條件,會發生什麼? (我問,因爲通常我會看到每次都會調用'session_start()'的實現,即使會話是在另一個請求中啓動的,在這種情況下,會話只會被恢復)。 – 2014-10-09 16:48:53

回答

1

我認爲實際的問題是,生成的圖像是由瀏覽器「緩存」。因此,它將從緩存中重用,並且Session變量從不設置(或者保持在其第一個狀態),因此即使在向用戶顯示圖像時也不會調用該腳本。

嘗試使用PHP生成img-tag並附加一個隨機參數,以確保客戶端瀏覽器再次調用腳本文件,因此會在每個請求中刷新會話變量。

echo '<img src="generatedice.php?r='.time().'" alt="captcha" height="50px"/>'; 

這樣可以避免瀏覽器緩存圖像,導致url會從秒到秒不同。


如果您包括您要處理的答案在同一頁上的圖像,它也可能是可能的,你實際上是在更新會話到新的驗證碼,你的第一個檢查前。

嘗試排除的形象,如果一個答案已經給出,看看是否是這樣的話:

if (!isset($_REQUEST["answer"])){ 
    echo '<img src="generatedice.php?r='.time().'" alt="captcha" height="50px"/>'; 
    }else{ 
    if (md5(SECRET+$_REQUEST['answer'])==$_SESSION['total']) { 
     echo "Your answer was correct"; 
    }else{ 
     echo "Your answer was wrong"; 
    } 
    } 
+0

我已經嘗試了兩個沒有運氣的人。 :-(如果我將'generatedice.php'文件轉換爲一個函數,我會有同樣的問題嗎? – Maelish 2014-10-09 17:25:16