我有一個基於會話的驗證碼的帖子表格,例如在刷新代碼後知道的代碼是Ujkd9變成Hi8P4。 這就是問題所在。如果有人發佈表單,輸入的驗證碼會變老,如何獲取舊會話?如何獲得舊會話?
如何獲得舊會話?
回答
那麼你不能,但你可以保存較早的會話到另一個會話密鑰創建會話的副本,通過例如:
$ _SESSION [「session_copy」] = $ _SESSION [「目前」] ;
我假設您的驗證碼正在飛行中,並通過一些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
我不知道你的驗證碼會有多少個字母。更改定義以適合您的使用。
你所要做的事情,在話來說就是:
- 查詢當前session_id的數據庫,看是否captcha圖像存在。
- 將信息設置爲變量,我正在使用
$captcha_data
- 如果$ 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存儲
我不能說我推薦這個選項。這與我之前的回答完全一樣,只是沒有數據庫交互。
在口頭上,我們正在做以下幾點:
- 檢查,如果
$_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.文件系統存儲
我想說,如果這是你的選擇選擇你有一些人生的決定。這不應該使用。永遠。認真。
話雖這麼說,基本的前提這裏是
- 看看是否與當前的session_id文件是否存在。
- 如果是這樣,請閱讀它的內容,並將它們用作圖像的哈希值。
- 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);
只是重申:請不要使用此方法。我提供這個答案只是因爲你的問題問如何保持驗證碼不變。
- 1. 如何獲得會話cookie
- 2. UIProgressView:如何獲得舊式?
- 3. 如何獲得會話ID在C#
- 4. 我如何獲得Rauth會話的oauth_verifier
- 5. 如何獲得會話的價值
- 6. 如何獲得表單中的會話?
- 7. 如何在遠程機器上獲得會話的會話ID?
- 8. 如何在iTerm2中終止舊會話
- 9. 獲取舊的REST會話密鑰
- 10. 如何創建新的會話替換舊的會話笨
- 11. 如何判斷陳舊的會話與沒有Java的會話
- 12. 新會話存儲舊會話信息
- 13. 舊會話超時後創建會話
- 14. Perl中獲得會話cookie
- 15. PHP會話獲得混合
- 16. 獲得價值會話
- 17. 通過ID獲得會話
- 18. 如何獲得textarea的舊值
- 19. 如何獲得舊版本的ZFTool?
- 20. 如何在Python3中獲得「舊」zip()?
- 21. 如何獲得.NET Standard的舊版本?
- 22. 如何在esper中獲得舊事件?
- 23. 如何獲得舊版eclipse的JRE?
- 24. 如何獲得較舊版本的riak
- 25. 我如何獲得Meteor的舊版本?
- 26. 如何獲得結束視頻會話的會話統計信息
- 27. 爲什麼不HttpRequest.getSession(真)獲得新的會話時,舊的空/無效
- 28. 如何在下一個會話中使用從舊會話保存的數據?
- 29. jsp-會話 - 如何使用舊會話(如果存在)但不創建新會話
- 30. 獲取與wmi的活動會話(Win32_LogonSession返回非活動/舊會話)