2013-02-28 57 views
0

我正在使用此代碼在PHP中創建安全登錄頁面。我從http://girlswhogeek.com/tutorials/2006/creating-a-secure-php-login-page得到它。回覆到div而不是空白頁

<?php 
    $username = "user"; 
    $password = "pass"; 
    $randomword = "bibblebobblechocolatemousse"; 

    if (isset($_COOKIE['MyLoginPage'])) { 
     if ($_COOKIE['MyLoginPage'] == md5($password.$randomword)) { 
?> 
    CONTENT HERE 
<?php 
    exit; 
     } else { 
     echo "<p>Bad cookie. Clear please clear them out and try to login again.</p>"; 
     exit; 
     } 
    } 

    if (isset($_GET['p']) && $_GET['p'] == "login") { 
     if ($_POST['name'] != $username) { 
     echo "<p>Sorry, that username does not match. Use your browser back button to go back and try again.</p>"; 
     exit; 
     } else if ($_POST['pass'] != $password) { 
     echo "<p>Sorry, that password does not match. Use your browser back button to go back and try again.</p>"; 
     exit; 
     } else if ($_POST['name'] == $username && $_POST['pass'] == $password) { 
     setcookie('MyLoginPage', md5($_POST['pass'].$randomword)); 
     header("Location: $_SERVER[PHP_SELF]"); 
     } else { 
     echo "<p>Sorry, you could not be logged in at this time. Refresh the page and try again.</p>"; 
     } 
    } 
?> 

<form action="<?php echo $_SERVER['PHP_SELF']; ?>?p=login" method="post"> 
    <fieldset> 
     <label> 
      <input type="text" name="name" id="name" /> Name 
     </label> 
     <br /> 
     <label> 
      <input type="password" name="pass" id="pass" /> Password 
     </label> 
     <br /> 
     <input type="submit" id="submit" value="Login" /> 
    </fieldset> 
</form> 

它的作品真的很好,但是,當有日誌信息的錯誤,它切換到一個空白頁和回聲出一個消息,說在日誌中的信息是錯誤的。我想知道是否有辦法讓它在輸入頁面上回顯到頁面上的div。我試圖把相關的回聲消息放入div中,但它不起作用。我必須承認,我甚至不知道爲什麼它會進入空白頁面。

此外,這是做到這一點的最好方法還是有辦法讓它更安全?

感謝您提供任何援助。

本尼。

回答

2

有2個問題:

  • 在你的代碼的exit停止頁面的執行,以便「回聲-ING」你的消息後,該頁面將停止
  • 如果你想在一個div顯示在一個變量中設置的消息,並在div代碼

這裏顯示它是你的代碼示例,重新加工了一下(你可能需要調整):

<?php 
$message = NULL; 
if (isset($_COOKIE['MyLoginPage'])) { 
    if ($_COOKIE['MyLoginPage'] == md5($password . $randomword)) { 
     ?> 
     CONTENT HERE 
     <?php 
     exit; 
    } else { 
     $message = "<p>Bad cookie. Clear please clear them out and try to login again.</p>"; 
    } 
} 

if (isset($_GET['p']) && $_GET['p'] == "login") { 
    if ($_POST['name'] != $username) { 
     $message = "<p>Sorry, that username does not match. Use your browser back button to go back and try again.</p>"; 
    } else if ($_POST['pass'] != $password) { 
     $message = "<p>Sorry, that password does not match. Use your browser back button to go back and try again.</p>"; 
    } else if ($_POST['name'] == $username && $_POST['pass'] == $password) { 
     setcookie('MyLoginPage', md5($_POST['pass'] . $randomword)); 
     header("Location: $_SERVER[PHP_SELF]"); 
    } else { 
     $message = "<p>Sorry, you could not be logged in at this time. Refresh the page and try again.</p>"; 
    } 
} 
?> 

<form action="<?php echo $_SERVER['PHP_SELF']; ?>?p=login" method="post"> 
    <fieldset> 
    <label><input type="text" name="name" id="name" /> Name</label> 
     <br /> 
    <label><input type="password" name="pass" id="pass" /> Password</label> 
     <br /> 
    <input type="submit" id="submit" value="Login" /> 
    </fieldset> 
    <?php 
    if (isset($message)) { 
     echo "<div>" . $message . "</div>"; 
    } 
    ?> 
</form> 
+0

嘿,謝謝JScoobyCed,這就像我想要的那樣工作。非常感謝。你能回答我的問題:這是多麼安全,是否可以更安全?這是做這件事的最好方法嗎? – Benjamin 2013-02-28 02:11:09

+0

恩......沒有「最好的辦法」來做到這一點。你提供的鏈接是從2006年開始的,所以我想你可以找一些更近期的帖子。請注意,使用md5進行登錄被認爲是不安全的,因爲可能會被利用,但如果你沒有保護財務信息,那麼你可能是很好的。 – JScoobyCed 2013-02-28 02:29:36

0

如果登錄失敗,則回顯登錄結果,但不顯示頁面。如果您想要在您的網站設計中顯示登錄失敗頁面,我建議將它們發送回登錄頁面並顯示錯誤消息。例如:

header("Location: http://website.com/loginpage.php?failed=1"); 

,然後在登錄頁面的代碼:

if ($_GET['failed'] == '1') echo "Failed to login. Please try again."; 

這樣,如果登錄失敗,他們將被送回登錄頁面,並顯示錯誤消息。

1

您是否把您的整個內容,包括<html>標籤在哪裏說CONTENT HERE

唯一應該去那裏的是安全內容,而不是整個頁面。您的樣板html,<html><head><title>title</title></head><body> ... </body></html>應該包含您發佈的所有代碼塊。 CONTENT HERE的內容僅顯示成功登錄,所以任何不安全的內容都不應顯示在那裏。

下面是我很久以前寫的一個PHP page locker的替代實現,這可能會使這個更清晰。 < /無恥插頭>

+0

我喜歡這個,因爲它使用會話。這更安全嗎?另外,是的,我知道這裏有什麼內容。我沒有選擇這個作爲公認的答案,因爲它是關於內容而不是錯誤消息。儘管如此,我喜歡你的代碼,並可能會與它一起。 – Benjamin 2013-02-28 02:13:38

+0

在cookies中存儲密碼並不是一個好習慣,這就是你問題中代碼的作用。即使它被散列,破壞MD5也是相當微不足道的。更好地使用會話並將密碼檢查限制在服務器端。如果JScoobyCed的答案能夠更好地解決您的問題,我並沒有冒犯,希望我的代碼有用。隨時與我聯繫的問題/反饋,這是舊的,但我很樂意改善它。 – dimo414 2013-02-28 05:25:20