2014-03-01 78 views
0

所以,我有一個有點麻煩的登錄表單。每當我嘗試訪問受限制的頁面時,它都會保留echo ing Incorrect password, please try again.。我有一個小提琴自己,但我一直無法找出什麼是錯的。代碼如下:任何人都可以幫助我在登錄表單中的這個錯誤?

<?php 

//MySQL Database connect; 

include "databaselogin.php"; 

//Checks if there is a login cookie 

if(isset($_COOKIE["ID_my_site"])) 

//If there is a cookie, the user is directed to a restricted page 

{ 

$emailaddress = $_COOKIE["ID_my_site"]; 

$pass = $_COOKIE["Key_my_site"]; 

$check = mysql_query("SELECT * FROM Users WHERE EmailAddress='$emailaddress'") or die(mysql_error()); 

while($info = mysql_fetch_array($check)) { 

    if ($pass != $info["password1"]) { 

    } 

    else { 

     header("location: restricted.php"); 

    } 

} 

} 

if (isset($_POST["submit"])) { //If the form has been submitted 

//Make sure they filled it all in 

if(!$_POST["emailaddress"] | !$_POST["password1"]) { 

echo("You did not fill in all the required fields."); 

} 

//Checks it against the database 

if (!get_magic_quotes_gpc()) { 

$_POST["emailaddress"] = addslashes($_POST["emailaddress"]); 

} 

$check = mysql_query("SELECT * FROM Users WHERE EmailAddress = '".$_POST["emailaddress"]."'") or die(mysql_error()); 

//Gives a message if the user doesn't exist 

$check2 = mysql_num_rows($check); 

if ($check2 == 0) { 

echo ("The Email Address that you have entered is not in use, <a href='register.php'>click here</a> to register"); 

} 

while($info = mysql_fetch_array($check)) { 

$_POST["password1"] = stripslashes($_POST["password1"]); 

$info["Password"] = stripslashes($info["Password"]); 

$_POST["password1"] = sha1($_POST["password1"]); 

//Gives an error is the password is wrong 

if ($_POST["password1"] != $info["Password"]) { 

    echo("Incorrect password, please try again."); 

} 

else { 

    //If the login is ok, a cookie is added 

    $_POST["EmailAddress"] = stripslashes($_POST["EmailAddress"]); 

    $hour = time() + 3600; 

    setcookie(ID_my_site, $_POST["emailaddress"], $hour); 

    setcookie(Key_my_site, $_POST["password1"], $hour); 

    //Then they are redirected to a restricted area 

    header("location: restricted.php"); 

} 

} 

} 

else { 

//If they are not logged in 

?> 

<form action="<?php echo $_SERVER['PHP_SELF']?>" method="post"> 

<table border="0"> 

<tr><td colspan=2><h1>Login</h1></td></tr> 

<tr><td>Email Address:</td><td> 

<input type="text" name="emailaddress" maxlength="40" placeholder="Email Address"> 

</td></tr> 

<tr><td>Password:</td><td> 

<input type="password" name="password1" maxlength="12" Placeholder="Password"> 

</td></tr> 

<tr><td colspan="2" align="right"> 

<input type="submit" name="submit" value="Login"> 

</td></tr> 

</table> 

</form> 

<?php 

} 

?> 

所有幫助將大規模讚賞。

+0

嗯,在這個頁面上似乎存在安全風險。 – Elfentech

+0

請解釋... –

回答

1

有幾個問題。首先,mysql_query是一個不推薦的PHP函數,應該用mysqli_query替換。代碼中的所有函數應該使用mysqli前綴而不是mysql(所以mysql_fetch_assoc應該更改爲mysqli_fetch_assoc)。這個函數還需要一個提供到數據庫連接的參數,這是通過mysqli_connect完成的。所以,你的代碼應該是這樣的:

$con = mysqli_connect($username, $password, $host, $db); // Fill in the variables with correct values 
$check = mysqli_query($con, "SELECT * FROM Users WHERE EmailAddress='$emailaddress'"); 

$con只需要設置一次,就可以在你的代碼中的其他查詢調用中使用。

+0

我已經使用包含「databaselogin.php」,其中包含數據庫和服務器信息,以便我不必在丟失頁面上編寫此代碼 –

+0

如果您已經在databaselogin中調用了mysqli_connect .php,只需將返回值分配給一個變量(如上面的$ con),並使用$ con或任何您在mysqli_query中稱爲它的第一個參數。不要忘記將所有的前綴改爲mysqli,因爲新版本的PHP甚至沒有安裝mysql前綴的函數,所以函數甚至不會運行,查詢也不會運行。 –

+0

感謝塞思,很好的幫助! –

0

首先,您將憑據存儲在Cookie中的方式非常危險。任何訪問您的計算機或訪問您的網絡,如果你不使用ssl可以竊取你的cookies並登錄到你的帳戶。

其次你的問題就出在

while($info = mysql_fetch_array($check)) { 

這是一個無限循環。你應該只調用一次。

你的整個代碼可以使用一些改進,如:

  • 更新MySQL來的mysqli或PDO
  • 使用預處理語句
  • 優化代碼以提高速度(使用||代替|)
  • 使用更強大的哈希算法

如果您想要更深入的指令來改善您的代碼,請發表評論

希望這有助於

改進

這是關於PDO一個偉大的文章。但是PDO是基於對象的,因爲你是PHP的新手,我不知道你的技能水平,所以你現在可以更好地使用mysqli。有很多關於如何做到這一點的文章。

PDO


在你的代碼

您使用

if(!$_POST["emailaddress"] | !$_POST["password1"]) { 

但如果你使用的||代替|如果條件跳過第二個參數,如果第一個失敗已經。


您使用sha1來散列您的密碼。但是這個算法是不好的做法。你應該在數據庫中使用Bcrypt或至少使用一個單獨的鹽對你SHA1加密每個密碼和存儲旁邊的密碼

SHA1 not safe anymore


你永遠不存儲用戶信息中的會話在下一次請求中保留登錄名,您實現它的方式稱爲記住我功能,並被認爲難以安全實施。首先使用會話更容易,如果您以後確實需要它,則更容易。

如果您使用會話,您還應該檢查session_id是否未被客戶端瀏覽器中的攻擊者設置。您可以通過設置一個隨機Cookie做到這一點,如init 而當這是沒有設置你打電話

session_regenerate_id(); 

您同時存儲電子郵件和在cookie中的散列密碼。這可能是非常危險的。即使在cookie中散列密碼,也不應存儲密碼。最佳做法是隨機創建一個高熵字符串,並將其僅存儲在cookie和數據庫中。當用戶使用該cookie登錄一次時,您應該使用新的哈希刷新該cookie。


要解決你的錯誤,你應該刪除周圍的mysql_fetch_array($check)

提示while循環在未來

你的代碼看上去更加有組織如果你開始學習與工作PHP對象。這也可以讓你的項目更容易處理。

我不知道你是否打算在生產網站上使用這段代碼,因爲我強烈建議不要這樣做。您可以更好地使用安全可靠的解決方案,讓有經驗的人獲得更多經驗,當您有更多經驗時,您可以開始自己創建。

+0

請說明我需要做些什麼來改善我的代碼。過去幾天我一直在通過phpacademy.org學習PHP,它涵蓋了一些sqli和sql,但我對代碼還不是很有信心。 –

相關問題