2015-05-13 74 views
0

所以我對PHP很陌生,我仍然在學習。我剛剛瞭解了超全球化,並使用POST,GET,SESSION,COOKIES等。 爲了測試我目前的知識,我做了一個簡單的登錄代碼。如果有兩個頁面,一個用於登錄,另一個是隻能由登錄用戶訪問的目的地。這很簡單,只有一個密碼「測試通過」,並通過if語句進行檢查。用戶名可以是用戶想要的任何東西。我顯然會爲這個項目添加更多的功能,比如註冊頁面,更改帳戶信息等等。但是如果不讓我的主代碼變得堅實,我就無法做到這一點。所以我的問題是,安全方面,這個代碼好嗎?你會做什麼不同,如果有非安全問題,我也想知道。PHP:我的網站登錄代碼出了什麼問題?

登錄頁面:

<form method="post"> 
    Username: <br> 
    <input type="text" name="user"> <br> 
    Password: <br> 
    <input type="password" name="pass"> <br> 
    <button type="submit" name="signin">Sign In</button> 
</form> 

<?php 


session_start(); 

    if (isset($_GET['logged']) && $_GET['logged'] == 'false'){ 
    session_destroy(); 
    header("Location: login.php"); 
    } 

    if (isset($_POST['signin'])){ //form was submitted 

    //username check 
    if (!empty($_POST['user'])){ //username entered 
     $_SESSION['user'] = htmlspecialchars($_POST['user']); 
    } else { //no username entered 
     echo "You must enter your username!"; 
    } 

    //password check 
    if (!empty($_POST['pass'])){ // a password was entered 
     if ($_POST['pass'] == 'testpass' && !empty($_POST['user'])){ // the password was correct and a username was entered 
     $_SESSION['logged'] = true; //user is logged in 
     header("Location: loggedin.php"); 
     } else { // incorrect pass 
     echo "Incorrect Password!"; 
     } 
    } else { //no pass entered 
     echo "You must enter a password!"; 
    } 
    } 

?> 

在頁面登錄:

<html> 
<head> 
    <?php session_start(); 
    if (!$_SESSION['logged']){ 
    header("Location: login.php"); 
    } ?> 
    <title>Welcome <?php echo $_SESSION['user'] . "!";?></title> 
</head> 
<body> 
    <a href="login.php?logged=false">Sign Out</a> 
</body> 
</html> 
+0

旁註:[你正在輸出標題](http://php.net/manual/en/function.error-reporting.php) –

+2

回答你的問題:不。我會做什麼不同?一切。從準備好的語句開始,直到使用'password_hash()'。 –

回答

1

單用戶可以。您可以通過添加md5()函數來提高安全性。 例如:$_POST['pass']=md5('testpass');$_SESSION['user']=md5($_POST['user']);

如果你想要多用戶代碼。添加mysql(數據庫)。

+0

我不會再使用md5()。這是一個弱散列,md5()和sha1()已過時。 > 5.5中的password_hash()是理想的。你也可以直接在<5.5 with sha256/sha512中使用crypt()來加強與salt的哈希。 – Devon

+0

是的..你可以添加任何哈希碼。 –

0

你要使用一個數據庫來存儲用戶和其他數據?如果您稍後要使用數據庫,則很難評估此安全性。

在這種情況下,您需要在查詢數據庫時使用準備語句,並在存儲像Fred說的那樣的密碼時進行散列。準備好的語句增加了防止SQL注入的保護措施,這對保持控制非常重要。

您需要擔心的另一種注射形式是腳本注入或跨站點腳本(XSS)。這是您打印用戶輸入時的情況。您已在上使用htmlspecialchars()添加了一些保護措施,但您可以做得更多,查看更多內容。

相關問題