2014-09-06 112 views
-3

我有一個基於會話的驗證碼的帖子表格,例如在刷新代碼後知道的代碼是Ujkd9變成Hi8P4。 這就是問題所在。如果有人發佈表單,輸入的驗證碼會變老,如何獲取舊會話?如何獲得舊會話?

回答

0

那麼你不能,但你可以保存較早的會話到另一個會話密鑰創建會話的副本,通過例如:

$ _SESSION [「session_copy」] = $ _SESSION [「目前」] ;

0

我假設您的驗證碼正在飛行中,並通過一些PHP中的圖像輸出。您的問題是,一旦您製作圖像並輸出圖像,您無法弄清楚CAPTCHA的實際價值是什麼?

因爲我絕對沒有什麼應用程序結構的知識,或數據庫的樣子,我可以給你根據我會做什麼,建議:

如果我可以假設你的PHP腳本看起來是這樣的:

$captcha_string = make_hash(); // This function could just be the consolidation of your step in making the hash. I don't know, so it's going to be generic. 

make_captcha_image($captcha_string); // Again, I don't know exactly how this goes, so I have to assume. 

用外行人的話說,你需要把它存儲在某個地方。但是哪裏?現在,我要記住,我從來沒有特別直接與Captcha合作過,所以我不是100%的「最佳實踐」,我也不知道你在做什麼,所以這些對於一個模糊的問題可能會是模糊的答案。大致有三種選擇,我看到它的方式。

1.數據庫存儲

實際上,我可能會使用數據庫作爲第一個前往。在我的數據庫我想有一個表名爲驗證碼,如下定義: CREATE TABLE captcha (captcha_id int unique not null auto_increment, session_id VARCHAR(100) NOT NULL, captcha_string VARCHAR(6) NOT NULL) 注:我不知道session_id()函數將返回什麼長,我目前無法檢查。如果您知道會話ID有多長,請更改session_id的長度以匹配。同樣的captcha_string我不知道你的驗證碼會有多少個字母。更改定義以適合您的使用。

你所要做的事情,在話來說就是:

  1. 查詢當前session_id的數據庫,看是否captcha圖像存在。
  2. 將信息設置爲變量,我正在使用$captcha_data
  3. 如果$ captcha_data中填充了信息,請使用其驗證碼字符串,否則請創建一個新的並將其存儲。

注意,在這個例子中,我假設你的數據庫連接,無論何種類型是,坐在我使用沒有特殊類型的數據庫,只是我在我自己的數據庫類使用方法命名爲$db的對象。這些定義對你來說看起來很相似,但可能並不確切。

$session_id = session_id(); 
$sql = "SELECT * FROM captcha WHERE session_id='".mysqli_real_escape_string($session_id)."'"; 
$result = $db->query($sql); 
if($result!==false){ 
    $captcha_data = $db->fetchrow($result); 
} 
$db->free_result($result); 



$captcha_string = (isset($captcha_data['captcha_string'])) ? $captcha_data['captcha_string'] : make_hash(); // This function could just be the consolidation of your step in making the hash. I don't know, so it's going to be generic. 

if(!isset($captcha_data['captcha_id'])){ 
    $sql = "INSERT INTO captcha (session_id, captcha_string) VALUES('".mysqli_real_escape_string($session_id)."','".mysqli_real_escape_string($captcha_string)."')"; 
    $db->query($sql);//You should check that this query is successful in your code, but for brevity I am skipping it. 
} 

make_captcha_image($captcha_string); // Again, I don't know exactly how this goes, so I have to assume. 

現在記住,我可能會添加一個日期或時間列驗證碼數據,這樣我可以刪除那些沒有在某些月份中使用,只是爲了保持尺寸減小賬戶值,但這是我留給你的東西。

2。$ _SESSION存儲

我不能說我推薦這個選項。這與我之前的回答完全一樣,只是沒有數據庫交互。

在口頭上,我們正在做以下幾點:

  1. 檢查,如果$_SESSION['captcha_id']值設置,如果是這樣,使用它。如果沒有,創建它。

此代碼會看起來很奇怪,所以我建議仰視Ternary Operators

//Assuming your session_start() is at the top of the page 

$captcha_id = $_SESSION['captcha_id'] = (isset($_SESSION['captcha_id'])) ? $_SESSION['captcha_id'] : make_hash(); 

make_captcha_image($captcha_string); 

3.文件系統存儲

我想說,如果這是你的選擇選擇你有一些人生的決定。這不應該使用。永遠。認真。

話雖這麼說,基本的前提這裏是

  1. 看看是否與當前的session_id文件是否存在。
  2. 如果是這樣,請閱讀它的內容,並將它們用作圖像的哈希值。
  3. else,創建一個新的哈希,創建並填充文件中的數據。

如何,看起來在代碼:

$session_id = session_id(); 
if(file_exists('temp/'.$session_id.'.php')){ 
    $captcha_string = $captcha_data = file_get_contents('temp/'.$session_id.'.php'); 
}else{ 
    $captcha_string = hash(); 
    file_put_contents('temp/'.$session_id.'.php',$captcha_string); 
} 

make_captcha_image($captcha_string); 

只是重申:請不要使用此方法。我提供這個答案只是因爲你的問題問如何保持驗證碼不變。