2011-04-09 200 views
2

我想實現一個驗證碼系統,並且我發現了一個很好很簡單的類低槽谷歌,做我想要的。PHP:將一個類實例傳遞給另一個頁面?

它是這樣的:

$captcha = new Captcha(); 
$prefix = mt_rand(); 
$image = $captcha->generate($prefix); 

然後我在表單中添加圖片:

<img src="<?php echo $image; ?>" /> 
<input name="captcha" type="text" value="Type the security code from above" /> 

它工作正常,到目前爲止,但我不知道如何檢查,如果提交的代碼與驗證碼匹配。 在文檔中,它說我有做到這一點:

$correct = $captcha_instance->check($prefix, $_POST['captcha']); 

但問題是,在提交表單$captcha$prefix都不見了......

我如何通過這些變量後,表單被提交到下一頁?

+1

你需要顯示一個鏈接到所述驗證碼類。 - 但是嘗試實例化一個新的。 - >檢查方法可能獨立工作。 (否則你必須將原始對象序列化到$ _SESSION中。) – mario 2011-04-09 02:42:10

+0

@mario:你說得對:D它只是我需要作爲隱藏輸入字段傳遞的$前綴:) – Alex 2011-04-09 02:52:45

回答

1

@mario:你是對的:d這只是 我需要傳遞的 隱藏的輸入字段的:) $前綴

這是一個非常糟糕的主意 - 在你的表單標籤,如果假設你有隱藏字段captcha_answer,並且你將該值傳遞給$captchaInstance->check(),那麼你打敗了驗證碼的目的。 Captcha的目標是從人類中挑選出機​​器人,但它通過在驗證碼解析機器人中下載源代碼並從源代碼中獲取value="{answer}"來讀取價值非常簡單。

相反,你應該這樣做:

<?php 
session_start(); 
$_SESSION['answer'] = $prefix; 
?> 

然後在你檢查你這樣做:

<?php 
session_start(); 
$prefix = $_SESSION['answer']; 
$passed = $captcha->check($prefix); 
?> 

事實上,我認爲這個類是僅具有靜態方法更好,但這是我的看法。無論如何,這意味着所有的數據只能存儲在服務器端,所以他們不能只查看源代碼的captcha答案。

+0

但$前綴不是驗證碼。我認爲這是它的ID或者什麼,因爲我看到了一個由這個ID生成的php和圖像文件名。該php文件在其中包含一個變量中的驗證碼。 – Alex 2011-04-09 03:22:29

+0

這比將驗證碼添加到源代碼中要好一些,但仍然很脆弱,因爲垃圾郵件發送者可能只需下載該庫並複製/粘貼算法,以便在其bot中從'$ prefix'生成驗證碼答案,然後讓該bot用該算法的返回值進行響應。 – ShotgunToothpaste 2011-04-09 03:25:30

+0

是的,但我只需要一些非常簡單的東西:) – Alex 2011-04-09 03:38:31

1

您可能需要將其設置在會話,然後當它的發佈,你需要在會​​話與值檢查

希望這有助於

1

你想馬歇爾該實例並將其保存在一個會話,因爲HTTP是無狀態的。然後您可以在第二頁上對它進行解碼。

然而

大多數PHP captcha系統我見過不需要此功能,而該檢查功能應獨立工作,通常是將數據從一個存儲會話和POST變量進行比較。