2010-07-26 34 views
4

我剛開始使用PHP和mySQL,需要知道這是否「安全」。登錄信息通過AJAX(jQuery)傳遞到下面的PHP文件中。PHP AJAX登錄,這種方法是否安全?

jQuery的AJAX

$("#login_form").submit(function(){ 
    $.post("login.php",{user:$('#username').val(),pass:$('#password').val()} ,function(data) 

PHP

ob_start(); 
mysql_connect("-", "-", "-") or die("ERROR. Could not connect to Database."); 
mysql_select_db("-")or die("ERROR. Could not select Database."); 

//Get Username and Password, md5 the password then protect from injection. 

$pass = md5($pass); 
$user = stripslashes($user); 
$pass = stripslashes($pass); 
$user = mysql_real_escape_string($user); 
$pass = mysql_real_escape_string($pass); 

//See if the Username exists. 
$user_result=mysql_query("SELECT * FROM users WHERE username='$user'"); 
$user_count=mysql_num_rows($user_result); 

if($user_count==1){ 
    if($pass_length==0){ echo "userVALID"; } 
    else{  
     $pass_result=mysql_query("SELECT * FROM users WHERE username='$user' and password='$pass'"); 
     $pass_count=mysql_num_rows($pass_result);  
     if($pass_count==1){    
      session_register("user"); 
      session_register("pass"); 
      echo "passVALID"; 
     } 
     else { echo "passERROR"; }  
    } 
} 
else { echo "userERROR"; } 

ob_end_flush(); 

我知道這可能不是做的事情,但最好的方式,這是我知道的方式!我只想知道它是否有任何重大的安全缺陷。這對我來說更像是一個概念,因此我沒有合併SSL。

+2

stripslashes($ user); ?我高度懷疑您已激活MAGIC_QUOTE並激活了REGISTER_GLOBAL。這兩個功能已被棄用,並強烈建議不要使用。 http://ca.php.net/manual/en/security.magicquotes.php http://php.net/manual/en/security.globals.php – HoLyVieR 2010-07-26 16:35:33

回答

5

你應該讓這種變化,以防萬一人們有一個反斜槓在他們的密碼:

if(get_magic_quotes_gpc()){ 
    $user = stripslashes($user); 
    $pass = stripslashes($pass); 
} 
$user = mysql_real_escape_string($user); 
$pass = sha256($salt.$pass); 

首先MD5是非常糟糕的。 md5()mysql_real_escape_string()也是多餘的。碰撞已經在野外產生了。 sha1()雖然減弱仍然更安全,沒有產生衝突(還)。最好的選擇是sha256 in php,或使用mhash庫。

$pass = md5($pass); 

您還需要salt the password.

+0

感謝您的信息;我知道我需要將其更改爲SHA,但是在我的第一次嘗試中這不起作用。我沒有聽說過醃製,所以再次感謝信息! – Phil 2010-07-26 16:23:39

+0

現在我感到很蠢。我的數據庫中的VARCHAR被限制爲50,所以當SHA1將它切斷時,現在排序,謝謝。 – Phil 2010-07-26 20:07:24

+0

@Phil不用擔心。我喜歡「文本」數據類型,但散列總是相同的大小,所以無論如何varchar可能會更好。 – rook 2010-07-26 20:33:13

5

它從

  • 遭受了未加密的連接發送密碼(使用HTTPS至少發送用戶名和密碼。這可以防止被動攻擊者,但不是針對活躍的密碼要避免主動安全攻擊者,你必須加密所有的通信)。
  • 將密碼存儲在數據庫中(您應該改爲存儲鹽味散列)。
+0

這是一個娛樂項目,因爲它是我的學校假期!由於這只是一個項目,我不願意爲SSL證書付費,除非我真的將其用於真正的使用。感謝Salted哈希建議! – Phil 2010-07-26 16:26:07

+0

@Phil嗯,嚴格來說你不需要SSL來做安全認證,你可以使用[摘要認證]的變體(http://en.wikipedia.org/wiki/Digest_authentication)。但是在這種情況下,我相信你不能存儲鹽漬散列(可以,但是如果暴露了數據庫數據,攻擊者可以以任何用戶身份登錄)。 – Artefacto 2010-07-26 16:29:28

+0

@Atrefacto ...實際上'$ pass = md5($ pass);'(第7行)。我相信他存儲MD5哈希 - 不是很安全,但它*不是*純文本。 – 2010-07-26 16:48:44

4

也永遠不會告訴用戶像「用戶不存在」或「不正確的密碼」。如果你只是打印出「不正確的用戶名或密碼」,那麼每個人都無法檢查現有的用戶名,然後嘗試猜出這些密碼。

+0

我知道這個問題,但是因爲這是一個我用來學習PHP和mySQL的項目,所以我認爲將一些更多的功能合併會更有趣。 jQuery實際上從PHP文件中提取返回的數據,並基於此改變CSS。所以當用戶名輸入模糊時,背景變成綠色。儘管出於顯而易見的原因,我還沒有將其應用於密碼!謝謝! – Phil 2010-07-26 16:29:19

+0

我個人不喜歡這個選項。然後我不知道我是否有錯誤的用戶名或密碼。如果您擔心這個問題,請限制每個用戶名的嘗試。 – Artefacto 2010-07-26 16:30:35

+0

如果用戶名錯誤,則變爲紅色。你就是這麼知道的。 – Phil 2010-07-26 16:43:19

1

了session_register()已過時,你應該使用$ _SESSION []。

您還在散列密碼字符串$ pass上執行字符串轉義;它將始終有一個十六進制值,因此不需要轉義。你可以在哈希前的密碼字符串上執行轉義,但這只是非常有用的(例如,如果你允許用戶保存包含需要轉義的字符的密碼短語,通常我不允許在代碼的註冊端) 。你也應該使用鹽。

1

此基礎上我的研究:

  1. 使用jQuery AJAX登錄是作爲普通的舊形式的安全。數據總是通過http請求發送。
    參考:ajax safe for login?
  2. 在登錄表單中使用SSL(https)可提供額外的安全性。
  3. 而不是使用的mysql_connect,你應該使用預處理語句
    參考:why prepared statement?prepared statement usage example
  4. 你應該使用單向密碼散列算法,如Bcrypt。單向散列算法意味着您無法將散列密碼轉換回純文本。但是您可以根據存儲在數據庫中的散列密碼來驗證輸入的密碼。
    參考:don't encrypt password, hash it instead.the Bcrypt and how to use it