2013-07-28 179 views
0

我試圖讓我的電子郵件驗證工作。一切工作儘可能發送電子郵件與哈希鏈接進行確認,但一旦它進入下面的verify.php鏈接它不會更新我的數據庫活動行從0到1.任何建議?確認電子郵件驗證

if(isset($_GET['email']) && !empty($_GET['email']) AND isset($_GET['email_hash']) && !empty($_GET['email_hash'])){ 
    // Verify data 
    $search = "SELECT email, email_hash, active FROM users WHERE email='".$email."' AND hash='".$email_hash."' AND active='0'"; 
    $match = $database->num_rows($query); 

    if($match > 0){ 

     //Fields and values to update 
     $update = array(
      'active' => 1 
     ); 
     //Add the WHERE clauses 
     $where_clause = array(
      'email' => '$email', 
      'email_hash' => '$email_hash', 
      'active' => '1' 
     ); 
     $updated = $database->update('users', $update, $where_clause, 1); 
     if($updated) 
     { 
      echo '<p>Your account has been activated, you can now login</p>'; 
     } 
    } 

}else{ 
    echo '<p>Your account is already activated</p>'; 
} 

回答

1

您的代碼是不正確的(使用$電子郵件/ $ email_hash但沒有宣佈他們),這是它如何工作的:

if(isset($_GET['email']) && !empty($_GET['email']) AND isset($_GET['email_hash']) && !empty($_GET['email_hash'])){ 
    // Verify data 
    $email = $_GET['email']; 
    $email_hash= $_GET['email_hash']; 

    $search = "SELECT email, email_hash, active FROM users WHERE email='".$email."' AND hash='".$email_hash."' AND active='0'"; 
    $match = $database->num_rows($query); 

    if($match > 0){ 

     //Fields and values to update 
     $update = array(
      'active' => 1 
     ); 
     //Add the WHERE clauses 
     $where_clause = array(
      'email' => '$email', 
      'email_hash' => '$email_hash', 
      'active' => '1' 
     ); 
     $updated = $database->update('users', $update, $where_clause, 1); 
     if($updated) 
     { 
      echo '<p>Your account has been activated, you can now login</p>'; 
     } 
    } 

}else{ 
    echo '<p>Your account is already activated</p>'; 
} 

我想補充的是,在生產階段,你必須轉義並驗證所有傳入數據(POST,GET等)。

+2

我認爲這個代碼將工作,但它是一個非常糟糕的主意在SQL語句使用$ GET/POST $ cariables:https://www.owasp.org/index。 php/SQL_Injection_Prevention_Cheat_Sheet –

1

您應該在if子句中定義$ email和$ email_hash。

$email = $_GET['email']; 
$email_hash = $_GET['email_hash']; 

目前,你是依靠過時指令稱爲register_globals的。

+0

這是爲什麼downvoted?這是一個正確的答案。如果您不滿意,請寫下原因... –

+0

可能因爲您沒有告訴他此代碼是危險的。 SQL注入傳入... –

+1

我只是回答爲什麼給定的代碼無法正常工作的問題。我們是否真的必須警告每個人關於每個安全問題,以避免downvotes? – Jarno

0

你的where子句陣列是壞的,它應該是

$where_clause = array(
    'email' => $_GET['email'], 
    'email_hash' => $_GET['email_hash'], 
    'active' => 0 // not 1 
); 

順便說一句,似乎您使用的是一些抽象庫數據庫查詢 - 試圖改變自己的選擇查詢使用佔位符,讓庫的轉義變量爲你。現在你的代碼看起來容易受到SQL入侵的影響。

1

你正在做一些非常明顯的錯誤。首先你應該打開錯誤。 必須使用error_reporting(-1)ini_set('display_errors', true)才能查看和發現錯誤。這是必不可少的,否則你會很難找到錯誤。 確保在應用程序處於生產環境中時關閉此功能。

在您的具體情況下,if條件無法工作。變量$search從不使用。您在$database->num_rows($query)中引用了一個未定義的$query變量。 和$email$email_hash未定義。

不要使用$email = $_GET['email'];。你必須清理所有的用戶輸入,否則你會得到sql注入!

而是使用數據庫特定的轉義函數或準備語句。 Mysql->

$email = mysql_real_escape_string($_GET['email']);