我有一個驗證碼可以生成骰子圖像和會話變量。它在活動服務器上隨機失敗,但從未在開發框中執行。我不確定會話變量是否存在問題,或者下面調用了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:
爲了記錄在案,我已經完全刪除了此驗證碼進程,並取而代之。但我仍然很好奇它是如何被修復的。
你有沒有比較'SECRET + $ _REQUEST [「答案」]'來'SECRET + $總'? (不是MD5哈希,而是實際的字符串本身) – 2014-10-09 16:11:58
是的,它們也不匹配。表格編號是正確的,但生成的編號是錯誤的。 – Maelish 2014-10-09 16:33:48
如果你擺脫了環繞'session_start()'的條件,會發生什麼? (我問,因爲通常我會看到每次都會調用'session_start()'的實現,即使會話是在另一個請求中啓動的,在這種情況下,會話只會被恢復)。 – 2014-10-09 16:48:53