2012-01-28 151 views
1

我使用下面的PHP代碼進行登錄而不使用數據庫。
它重定向在兩種情況home.php:
1.當我輸入正確的用戶名和密碼
2. 當我輸入任何字符/秒爲用戶名(除了真實的用戶名)和密碼保留文本框爲空。不使用數據庫的PHP登錄腳本

在其他情況下,除了第二種情況,代碼正常工作。
如何使代碼在第二種情況下正常工作?

<?php 
session_start(); 

$userinfo = array(
       'user1'=>'pass1', 
       ); 

if(isset($_GET['logout'])) { 
    $_SESSION['username'] = ''; 
    header('Location: ' . $_SERVER['PHP_SELF']); 
} 

if(isset($_POST['username'])) { 
    if($userinfo[$_POST['username']] == $_POST['password']) { 
     $_SESSION['username'] = $_POST['username']; 

     header('Location: home.php'); 
    }else { 
     header('Location: login.php'); 
    } 
} 
?> 
+1

爲什麼你使用這一行'if($ userinfo [$ _ POST ['username']] == $ _POST ['password'])'? – Lion 2012-01-28 19:37:58

+0

它檢查輸入的用戶名和密碼是否與持有username =>密碼組合的'$ userinfo'數組相匹配。 – drew010 2012-01-28 19:41:57

+0

哦!我從來沒有在PHP中看到過這樣的表達式,因爲我來自Java環境,並且想知道關於它的一些情況。 – Lion 2012-01-28 19:47:09

回答

2

你可以改變

if($userinfo[$_POST['username']] == $_POST['password']) { 

if(isset($userinfo[$_POST['username']]) && $userinfo[$_POST['username']] == $_POST['password']) { 

它失敗的原因是因爲如果輸入的用戶名不是你的陣中,$用戶信息[ 'idontexist']回報null,它的計算結果是一個空字符串,所以你最終比較null == ''這是真的。

使用修改的代碼,您首先檢查以確保輸入的用戶名實際存在於您的數組中。如果沒有,密碼檢查從不運行,它們被重定向到登錄頁面。

您也可以使用===比較兩者,但在某人編輯表單並刪除密碼字段以便$_POST['password']變爲null並輸入不存在的用戶時最終會比較null爲空,這將允許他們登錄。使用isset檢查以確保用戶名存在於數組中,然後比較密碼。

只是爲了安全起見,您可能需要檢查密碼是否爲空,並跳過密碼檢查並立即返回到登錄頁面。

編輯: 爲了讓你想要的2例,嘗試:

if ((isset($userinfo[$_POST['username']]) && $userinfo[$_POST['username']] == $_POST['password']) || (!isset($userinfo[$_POST['username']]) && strlen($_POST['username']) > 0 && $_POST['password'] === '') {

這用來檢查用戶名是數組中,如果因此要確保密碼匹配或檢查用戶名不在數組中,並確保密碼爲空。

+0

這不會檢查「當我輸入任何caracter/s作爲用戶名(真實useraname除外)並將密碼文本框留空。」 – 2012-01-28 19:43:06

+0

嗯,我想我誤解了這個問題。我不確定你爲什麼要允許使用錯誤的用戶名和密碼進行登錄。所以我的回答是無效的。 – drew010 2012-01-28 19:48:45

+0

首先閱讀要求的問題...「它重定向到home.php在兩種情況下:」 – 2012-01-28 19:49:14