2009-05-27 158 views
0
<?php 
class test_class { 

     public function __construct() { 

     } 
     public function doLogin($username,$password) { 

      include("connection.php"); 

      $query = "SELECT * 
         FROM users 
         WHERE username = '".mysql_escape_string($username)."' 
         AND password = '".mysql_escape_string($password)."'"; 
      $result = mysql_fetch_array(mysql_query($query)); 
      if(!$result) { 

      return 'no'; 
      } 
      else 
       { 
      return 'yes'; 
       } 
      } 


} 
?> 

上面的代碼有效,但有點擔心它的安全與否。這段代碼是否安全 - PHP && MySQL

注意:我沒有使用POST方法,所以我必須接收它作爲參數在函數中,我不能使用。

if (isset($_POST['username']) && isset($_POST['password'])) 
     { 
     $username= $_POST['username']; 
     $password= $_POST['password']; 

回答

5

代碼可能是安全的,但實現並不好。 您不應該將驗證密碼存儲爲純文本。你應該鹽和散列它。

我可以花一個小時解釋爲什麼,但是你會做得更好just reading this

-3

我認爲它是好的,但是,如果我是擔心安全,我想「用戶名」的密碼存儲到變量中,並查詢之外進行比較。

1

不可以。您不應該將原始密碼存儲在數據庫中。存儲它散列(最好用鹽)。此外,準備好的報表是比轉義更好的選擇。看到這個PHP PDO documentation。作爲一個額外的好處(除了安全性),它們可以更高效。

+0

他問,如果代碼是確定的,不是MySQL imlementation :) – Skuta 2009-06-03 12:20:05

2

呃....你正在存儲一個純文本密碼?這當然不安全。密碼應該使用sha256之類的鹽進行哈希處理。存儲明文密碼絕不是一個好主意。

4

查詢本身看起來很安全,但是如果您使用支持參數綁定的數據庫接口(如PDO或Zend_Db),則不必非常緊張地仔細檢查每個SQL語句。

此外,mysql- *函數幾乎不推薦使用;你應該看看mysqli- *函數。

作爲一種風格方面的說明,空構造函數沒有意義,我建議返回布爾值true或false而不是字符串值。

最後,如別處所述,存儲明文密碼是一個壞主意。

1

代碼本身看起來沒問題,但我看到的主要問題是您要在純文本中傳遞密碼。

在客戶端與服務器連接的安全(即使用SSL) 是服務器對數據庫連接進行安全

如果在這兩種情況下的人可以坐在電線和觀看交通經過,那麼你有安全問題。

如果是我,我肯定會在客戶端&服務器之間建立SSL連接。

我會確保你在數據庫中存儲了密碼的散列。

而且我要你的代碼更改爲類似

//Pseduo Code 
SELECT * FROM Table where UserName = $username 
Get Row Back 
if(MD5Hash($password) == DataRow[Password]) 
    //Valid