2014-04-08 71 views
0

我想創建一個沒有數據庫的管理員登錄(這是一個非常簡單的網站)這裏是我的代碼,這將是安全的還是易於使用我的會話?我怎樣才能讓它變得更好?PHP +沒有數據庫:登錄 - >這會保密嗎?

的index.php

<?php 
include("auth.php"); 

if(!checkAuthentication()){ 
?> 
<form method="post" action="?login=1"> 
    <label for="username">Username</label> 
    <input type="text" id="username" name="username"> 
    <label for="password">Password</label> 
    <input type="text" id="password" name="password"> 
    <input type="submit" value="Login"> 
</form> 
<?php 
}else{ 
header("Location: protected_page.php"); 
exit(); 
} 

的functions.php

<?php 
session_start(); 

// Check if username and password matches 
function authentication($username, $password){ 
    if($username == md5("admin") && $password == md5("password")){ 
     return true; 
    }else{ 
     return false; 
    } 
} 

// Check if session data is still valid 
function checkAuthentication(){ 
    if(isset($_SESSION['username']) && isset($_SESSION['password'])){ 
     $result = authentication($_SESSION['username'], $_SESSION['password'], false); 
    }else{ 
     $result = false; 
    } 
    return $result; 
} 

if(isset($_POST['username']) && isset($_POST['password']) && $_REQUEST['login'] == 1){ 
    $username = md5(htmlspecialchars($_POST['username'])); 
    $password = md5(htmlspecialchars($_POST['password'])); 
    if(!authentication($username, $password)){ 
     echo "Wrong Login."; 
    }else{ 
     $_SESSION['username'] = $username; 
     $_SESSION['password'] = $password; 
     header("Location: http://localhost/login/protected_page.php"); 
     exit(); 
    } 
} 
?> 

protected_pa​​ge.php

<?php 
include("auth.php"); 

if(!checkAuthentication()){ 
    header("Location: http://localhost/login/index.php"); 
    exit(); 
} 

var_dump($_SESSION); 
?> 

謝謝您的幫助!

+6

此問題似乎是無關緊要的,因爲它是一個代碼審查請求。這更適合http://codereview.stackexchange.com –

+4

^這也不要使用'md5()'來輸入密碼。它已經過時,並不是爲了開始密碼而設計的。請參閱:http://www.php.net/manual/en/faq.passwords.php –

回答

3

有幾件事情:

首先,你存儲在PHP文件本身以純文本的用戶名和密碼。這不僅是一件壞事,也是一件噩夢。假設您的腳本在不斷增長,您需要50個用戶才能使用「安全」區域 - 這將是一件噩夢般的事情。

其次你的腳本不能很好地處理攻擊(即蠻力)。我可以對它進行5,50,500次暴力攻擊,它不會鎖定「我的」帳戶或IP地址。也許有些東西需要研究。

密碼應存放某處安全的,而不是檢查md5('password') == $_POST['password']值(例如),你應該檢查md5($_POST['password']) == $hashedpassword其中$hashedpassword是存儲的哈希值的地方網站上的/在數據庫中。這樣,如果有人進入您的網站,沒有純文本密碼。

而且我注意到你,包括你的index.php auth.php,但不檢查,以查看用戶是否已經登錄(例如,如果用戶關閉瀏覽器並不能會發生這種情況請記住保護區的完整網址)。那麼如果用戶登錄兩次會發生什麼?如果用戶在登錄時登錄了登錄框,會發生什麼情況?食物的思想。

最後,考慮(爲UX用途)有index.php檢查用戶是否登錄,如果沒有,轉移他們到login.php。這意味着如果他們失去連接(瀏覽器關閉)並轉至www.yoursite.com,如果他們登錄,他們可以看到任何內容。這只是個人喜好,但值得研究。

最重要的是:考慮使用框架。有很多原因可以解釋爲什麼你應該這樣做,以及你在這裏問我們是否安全的事實,絕對有理由告訴你,事實並非如此。網頁上的洞太多了,請不要添加到它們中。除非你真的確定你在做什麼 - 抓住一個框架。

+0

您好,首先,優秀的回覆!這是一個很好的閱讀! 讓我做一些問題... 1)你會在哪裏建議存儲密碼(請記住,沒有數據庫這是一個非常簡單的站點) 2)如果我在「阻塞」之前創建了多少次重試的限制(以及如何在沒有數據庫的情況下執行此操作) 3)我已經更正了我的代碼中的索引,我起初沒有注意到:P 謝謝 – user2894688

+0

哦,我沒有使用框架,因爲我開始弄到PHP的hang so,因爲這是一個小小的個人項目即時通訊只是試圖看看我是否可以權衡函數與類(例如登錄),你用什麼,類或函數? – user2894688

+0

謝謝!aaaaaaaa – user2894688