2017-04-05 32 views
-3

如何編寫安全用戶名&在PHP中進行密碼驗證?如何在PHP中編寫安全的用戶名和密碼驗證以防止SQL注入?

我使用密碼($ pass)的MD5和用戶名($ name)的字符串,並將這些代碼寫入PHP以進行用戶帳戶驗證。

$post_vars = $_POST; 
if (isset($post_vars['name'])) 
     { 
     $name = $post_vars['name']; 
     $pass = md5($post_vars['pass']); 
     $dbConn = db_open(); 
     $sql = "select `password` from `user_table` where `user_name` = '$name' limit 1;"; 
     echo $sql; 
     $sth = $dbConn->prepare($sql); 
     $sth->execute(); 
     $row = $sth->fetch(); 
     if ($row !== false) 
     { 
      $verify = $row['password']; 
      if ($pass == $verify) 
      { 
      $_SESSION['isLoggedIn'] = true; 
      header('Location: ' . _DEBUG_URL_); 
      } 
      else $iframeURL = _LIB_URL_ . 'accessdenied.htm'; 
     } 
     else echo 'No results found!'; 
    } 

這是查詢被破解通過SQL注入的方法,以及它如何被黑客攻擊?我爲MySQL使用PDO。

"select `password` from `user_table` where `user_name` = '$name' limit 1;" 
+0

也可以使用'密碼hashing',而不是'md5'。你也沒有正確使用'準備' –

+0

正如Alive to Die所說,使用密碼散列!你可以谷歌「md5」破解並輕鬆破解md5哈希。 – bedtime21

+0

我想知道這是我的查詢是不安全的或不是如何? –

回答

-2

Mysql注入發生在表單字段中,人們只需在登錄表單中輸入一個查詢,他們只需按登錄。您可以使用PDO::prepare語句中找到here

我還建議讓查詢與sprintf()這樣的:

$sql = sprintf("select `password` from `user_table` where `user_name` = '%s' limit 1", $name); 
+1

我不敢相信我的眼睛。 sprintf的保護?當真? –

+0

@YourCommonSense我從來沒有說過它是爲了保護?我只是推薦它..? – KittyCat

+1

這個人問如何保護他的查詢,你建議他直接添加$ name的sprintf。你的答案中是否有任何邏輯? –