簡體   English   中英

PHP mysql中的用戶名和密碼驗證

[英]username and password validation in php mysql

我想要做的是:當用戶在index.html頁面上的表單中輸入用戶名和密碼時,如果他們與數據庫中的內容匹配,則將他們發送到下一頁; userlogin.php。 如果他們的用戶名或密碼不正確,則要求他們在index.html頁面上重新輸入其詳細信息,並在表單文本框上方顯示錯誤,例如“您的用戶名不正確”或“您的密碼不正確”。 如果需要,我可以粘貼此代碼。

我是否也可以將此文本字體顏色更改為紅色?

這是我目前在userlogin.php頁面上使用的代碼

<?php
mysql_connect("Server", "root", "Gen") or die("Couldn't select database.");
mysql_select_db("generator") or die("Couldn't select database.");

$username = $_POST['username'];
$password = $_POST['password'];

$sql = "SELECT * FROM users WHERE Username = '$username' AND Password = '$password' ";
$result = mysql_query($sql) or die(mysql_error());
$numrows = mysql_num_rows($result);
if($numrows > 0)
   {
    echo 'Your in';
   }
else
   {
    echo 'Your not in';
   }
   ?>

這段代碼有很多錯誤之處:

1-您有一個SQL注入孔。

如果我輸入' or 1=1 LIMIT 1 --作為用戶名,無論如何我都會獲得訪問權限。
將您的代碼更改為。

$username = mysql_real_escape_string($_POST['username']); 
$password = mysql_real_escape_string($_POST['password']); 

請參閱: 來自“ Bobby Tables” XKCD漫畫的SQL注入如何工作?

2-您將密碼明碼存儲
這是一個很大的不。 結合SQL注入漏洞,黑客需要5分鍾才能獲得您網站上所有用戶名和密碼的列表。

將密碼存儲為鹽值哈希。

我喜歡使用用戶名作為鹽。

您可以使用以下方式存儲密碼哈希:

INSERT INTO users (username, passhash) 
VALUES ('$username', SHA2(CONCAT('$password','$username'),512))

然后您使用以下方法測試用戶憑據:

SELECT * FROM users 
WHERE username = '$username' AND 
passhash = SHA2(CONCAT('$password','$username'),512)

請參閱: PHP密碼的安全哈希和鹽
並且: 與MYSQL sha1相關的“鹽”是什么?

順便說一句,使用密鑰長度為512的SHA2,SHA1不再安全,並且MD5更加損壞。

3-登錄只能與1個用戶匹配
這段代碼:

if($numrows > 0) 

毫無意義,如果您從數據庫中取出兩行,則表明有人入侵了您的系統。 測試應為:

if($numrows > 1) { //send email to sysadmin that my site has been hacked }
else if ($numrows = 0) { echo "wrong username or password" }
else { echo "welcome dr. Falken" }

4-如果有錯誤不要死,調用例程以重新啟動連接或其他操作

這段代碼:

$result = mysql_query($sql) or die(mysql_error());    

在測試中很好,但是在生產中您應該做類似的事情

$result = mysql_query($sql);
if ($result) {
  //do the deed
} else {
  //call error recovery routine
}

錯誤恢復例程應重新連接到服務器,在日志中記錄錯誤。 如果錯誤無法解決,則應向sysadmin發送電子郵件,然后終止服務器。

首先, 您的代碼容易受到SQL注入的攻擊 使用PDO和准備好的語句來解決此問題。 其次,您似乎正在存儲未加密的用戶名。 這是非常不安全的 使用哈希函數對密碼進行加密,並在運行查詢獲得匹配之前對提交的密碼進行加密。 為輸出着色很簡單:

echo '<span style="color:red">Your not in</span>';

並使用會話實際登錄用戶。成功查詢用戶表中的用戶名/密碼組合后,將返回的user_id存儲在$_SESSION變量中。 在需要保護的每個頁面上,只需檢查$_SESSION['user_id'] 如果不存在,則您的用戶需要登錄,因此將其重定向到登錄表單。

那應該為你做把戲;)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM