2017-09-25 82 views
0

我使用這個代碼在我登錄form.Everything工作:登錄表單的安全防範措施

$username = trim($_POST['username']); 
$password = trim($_POST['password']); 
$pass=md5($password); 
$stmt = $mysqli->prepare("SELECT id FROM users WHERE username = ? AND password = ?"); 
$stmt->bind_param('ss', $username, $pass); 
$stmt->execute();  
$stmt->store_result(); 
$stmt->bind_result($id); 
$stmt->fetch(); 

if ($stmt->num_rows == 1) { $_SESSION['name']=$id; echo'user logged in';} 
else {echo'invalid username/password';} 
$stmt->close(); 

但我應該用別的東西嗎?還是夠了?我是新準備的語句,所以我想知道語法是否寫得很好。

+2

首先,你應該使用password_hash/password_verify而非MD5。 (不過,如果你已經將密碼存儲爲md5,它將不起作用。) –

+0

準備好的聲明怎麼樣?寫得好嗎? – rimas

+0

準備好的語句部分對我來說看起來很好,但是在保存密碼時需要確保它們不包含任何將被'trim'刪除的前導/尾隨空格。如果切換到使用password_hash + password_verify,則需要將其更改爲僅根據用戶名進行選擇,獲取記錄,然後驗證密碼。 –

回答

0

一方面你使用準備好的語句,這是防止SQL注入(除了可能的性能提升)是非常有用的,有關準備語句的好處是犯了一個錯誤可以給你不正確的結果,但不開門攻擊者連接查詢字符串do。

但另一方面,您正在使用md5()散列密碼是不推薦幾年。正如評論PHP建議現在有專門爲管理密碼,password_hash()password_verify()這是很簡單的使用創造了兩個功能。

我強烈建議比你的菜md5()即使這意味着存儲在數據庫中的密碼的再生,因爲該功能幾乎是無用的nowdays(與MD5的攻擊者可以很容易地在一兩天破解都是你的密碼,只需配備一臺計算機與高端顯卡)。

編輯:要使用password_hash()老調重彈你原有的密碼,你可以做這樣一個漸進的過渡,東西:

  • 您在數據庫添加一個字段輸入新密碼,默認爲空。
  • 加入新用戶存儲在新密碼字段password_hash()獲得的散列,和離開舊字段爲空。
  • 對於現有用戶更改登錄代碼,使其雙向
    • 如果新的字段爲空,你覈對舊的密碼,如果密碼正確,你老調重彈的密碼password_hash(),其存儲在新的領域和清空舊值。最後一步對於擺脫不安全的散列很重要。
    • 如果新的字段不爲空,則該用戶已被遷移或者它是一個新的用戶,所以你檢查對新場password_verify()。在投入生產之前

當然,仔細檢查這一點,因爲你是刪除舊的哈希值。這可能需要一些時間,如果有很多用戶或他們偶爾登錄,但如果您有足夠的槓桿作用,您可以訂購強制登錄以加快此過程。

+1

使用md5,你可以在一臺或兩臺_minutes_上用一臺只裝有_a web瀏覽器的計算機破解大部分密碼._; –

+0

@ Don'tPanic好的,我沒有想到雲計算機。 –

+0

嗯,你知道,crackstation等。我有一天在其他工作時使用它來恢復遺留系統的一些密碼。 easy peasy –