2013-04-30 21 views
0

所以這就是這種情況,它與我設置的一個愚蠢的驗證碼系統有關。使用TPL文件將值從一個php頁面傳遞到另一個頁面

register.php,register.tpl,writer.php

register.tpl創建形式

register.php處理形式,但也首先創建一個隨機數的形式,在寄存器中。 tpl選擇作爲變量,即{vcode}。

即隨機數在下面的上下文中使用:

<img src="/system/writer.php?R=0&amp;T={vcode}" /> 
<input type="hidden" name="syscode" value="{vcode}" /> 
<strong>Enter Code:</strong> 
<input name="code" type="text" id="code" /> 

writer.php捕獲VCODE的值,並創建一個圖像。

問題:

a。 vcode可以被機器人讀取,因此這個驗證碼是無用的。

b。 register.php詢問是否syscode!=代碼,但是又一次syscode是無用的字段,因此機器人可以讀取它。

c。我已經在register.php中生成了一個隨機數並將其放在writer.php中的過程,但是我無法獲得在register.php中創建的隨機變量的值以進行比較,如下所示:

在writer.php中我有$ randno =和(1,999999);並且該值顯示爲圖像 - 我知道你們都知道,但現在我需要register.php來讀取$ randno或獲取該值,以便它可以進行比較,如下所示:

if $ code = $ randno {stuff}

基本問題是使用TPL文件創建值得信賴的驗證碼......這並不容易。

每一個,我感謝你的幫助和幫助我。

回答

0

簡單的解決方案:

使用會話存儲器存儲所述代碼或使用數據庫:

寄存器產生一個代碼,該代碼存儲在會話/數據庫。

如果您想使用數據庫,請務必使用例如隨機令牌,以避免對其他代碼進行暴力破解。

如果不是,攻擊者可以使所有驗證碼失效,並且用戶無法註冊。

如果您使用會話,您可以省略token.php的標記,數據庫,隱藏字段和參數。

,但如果你不想使用會話:

register.php:

if(form_is_submitted()) { 
    /*check captcha */ 
    $captcha_id = (int) $_POST['captcha_id']; 
    //SELECT code, token FROM captchas WHERE id = $captcha_id 
    if($token != $_POST['token']) 
    die("Error"); 

    // DELETE FROM captchas where id = ... 

    if($code != $_POST['code']) 
    // -> error 

} 
/* Display form */ 
$code = generate_code(); 
$token = generate_token(); 
mysql_query("INSERT INTO captcha (code, token) VALUES ($code, $token)"); 
$tpl['chaptcha_id'] = mysql_insert_id() 

register.tpl

<img src="/system/writer.php?R=0&amp;T={captcha_id}" /> 
<input type="hidden" name="token" value="{token}" /> 
<input type="hidden" name="captcha_id" value="{captcha_id}" /> 
<strong>Enter Code:</strong> 
<input name="code" type="text" id="code" /> 
相關問題