2011-04-13 82 views
1

我試圖在我正在構建的表單中實現一個簡單的驗證碼,但是我遇到了一個我似乎無法自行整理的問題。將用戶輸入的CAPTCHA值與存儲在會話中的期望值進行比較

我使用簡單代碼來生成,像這樣的隨機數....

$randomnr = rand(1000, 9999); 
$_SESSION['randomnr2'] = md5($randomnr); 

....,然後一些更多的代碼以產生所述隨機數的圖像,並在顯示它頁。我反對它這樣的有效性....

if (strlen($captcha) !== ($_SESSION['randomnr2'])) { 
    $error['captcha'] = "CAPTCHA error. Please try again"; 
} 

如何去檢查一直輸入驗證碼輸入字段對一個儲存在會話randomnr2隨機數的價值?

+0

Woo Wooo Wooo!這不是captcha的工作方式。您不檢查長度,而是檢查兩個字符串的實際內容。至於你的第二個問題,沒有一個id =「captch」有一個,最好是他輸入的輸入字段來填充驗證碼。 – Khez 2011-04-13 21:23:48

+0

您正在存儲的會話中存儲的$ randomnr的值...您還應該哈希$ captcha的值並比較兩個哈希值 – 2011-04-13 21:24:43

+0

@Khez - 是的,對不起。這不是我應該檢查的長度 - 這是內容:)謝謝你。從下面的答案我看到,我應該使用'int'來代替。輸入字段同時包含。感謝您的回覆:) – Alan 2011-04-13 21:36:45

回答

1

我不知道你爲什麼要覈對這裏的字符串的MD5哈希字符串的長度,但假設$captcha從用戶數,你可以這樣做:

if(md5($captcha) !== $_SESSION['randomnr2']) { 
    $error['captcha'] = "CAPTCHA error. Please try again"; 
} 
+0

謝謝你,但它不起作用。我想要做的是確定存儲在'$ captcha'變量中的VALUE(不是strlen)是否與散列隨機數匹配。該變量確定如下..... $ captcha = $ _POST ['captcha'];'其中captcha是表單上的用戶輸入字段 - 。我意識到我可能會採取不同的方法 - 因爲這是不安全的,因爲另一個有用的靈魂指出 - 但如果我能學會如何做到這一點 - 如果可以做到的話,它仍然會真正幫助我。那個值可以比較哈希值嗎? – Alan 2011-04-14 02:58:38

+0

讓我看看,你上面寫的代碼說「如果散列變量'captcha'不等於存儲在會話'randomnr2'中的散列號,那麼返回錯誤變量.....是對的嗎?這應該適用於我那麼......但它不會:( – Alan 2011-04-14 03:03:25

+0

它確實有效)我非常抱歉,非常感謝GSto這個金塊。我是我的白癡我今天早些時候改變了captcha腳本,並刪除了隨機數得到的部分存儲在會話中 - 我只是試圖讓原始數據匹配。無論如何,因爲沒有會話與存儲的值它永遠不會工作,但現在有,它的作品像一個魅力。謝謝:) – Alan 2011-04-14 03:10:17

0

PHP將任何自動轉換爲字符串(如果可以)爲strlen(),所以

echo strlen(42); 
echo strlen('42'); 

將兩個輸出「2」,即使第一個是一個整數。爲了比較提交的值到店裏價值,它是那樣簡單

if ($_SESSION['randomnr2'] === (int)$captcha) { 
    ... it matched ... 
} 

您將要提交的值再次轉換爲int,如PHP $ _GET/POST陣列的任何一個在內部處理串。

+0

謝謝對於你的回覆馬克。我有事情建立好友的方式是我或多或少必須以這種方式檢查...如果輸入字段「驗證碼」的內容與存儲的散列號不匹配,則顯示「再次嘗試「別繼續...... – Alan 2011-04-13 21:40:27

0
<div id='captcha_to_show' style='border:1px solid silver;'>gobldeygook</div> 
<input name='captcha' id='captcha'> 

...

通過scriptmonkey附...

$('document').ready(function(){ 
    $('#captcha').val($('#captcha_to_show').html()); 
}); 

尋找到一個開放源代碼的驗證碼腳本。你的實現需要在整個頁面上發送驗證碼,它的價值可以通過任何拉動頁面的方式來看到,並且該人/機器人/任何可以相應地填充驗證字段,所以你實際上具有零保護。這就是爲什麼驗證碼要麼使用難以用腳本閱讀的複雜圖像,要麼是人類在機器人中更好地理解的語義問題,比如['你會說1和3的總和是什麼?')。 === 4]。是的,更簡單的圖像captcha與設置的字體,間距和大小可以用一種像素模式字典攻擊黑客入侵。

相關問題