2010-12-01 85 views
0

您好,我有一個問題。我使用cookies設置了我的登錄系統並且它可以工作。但我不知道是否有更乾淨的版本。僅在登錄後才顯示內容

<? 
include('../config/db_config.php'); 

$username = $_COOKIE['user']; 
$password = $_COOKIE['pass']; 

$result = mysql_query("SELECT * FROM users WHERE isadmin = 1"); 

while($row = mysql_fetch_array($result)) 
{ 
    if($username == $row['username'] && $password == $row['password']) 
    { 
     //User entered correct username and password 
     echo("ALLOW"); 
    } 
    else 
    { 
     //User entered incorrect username and password 
     echo("DENY"); 
    } 
} 
?> 

您看到我希望我的所有內容僅在以管理員身份登錄時纔會顯示。所以,現在只有這樣做的方法是將ECHO的HTML/PHP/Javascript而不是回顯允許,因爲如果我只是包含(「somepage.php」)那裏的頁面仍然可以使用而無需登錄,即使我在那裏做同樣的檢查,我仍然會迴應一切。

+0

爲所有安全**的愛閱讀@ MainMa的帖子**! – zzzzBov 2010-12-01 21:43:10

回答

4
  • 你爲什麼要加載每個用戶,然後比較用戶名和密碼?加載一個匹配用戶名和密碼的用戶會不會更容易?

  • 加載單個用戶將允許刪除while()

  • 在PHP中,不要使用mysql_query; 使用PDO(如果需要,谷歌它知道爲什麼它更好)。

  • 檢查您的輸入(在這裏非常可選,我同意)。

  • 千萬不要以純文本格式存儲密碼。

你或許可以這樣做(我沒有使用PHP/PDO多年,所以代碼可能是不準確的):

if (strlen($username)> 128) 
{ 
    // Something wrong. The username is too long. 
} 

$hash = sha1($password); 
$sth = $dbh->prepare('if exists(select * from users where isadmin = 1 and username = :username and password = :password) select 1 else select 0'); 
$sth->bindParam(':username', $username, PDO::PARAM_STR, 128); 
$sth->bindParam(':password', $hash, PDO::PARAM_STR, 40); 
$sth->execute(); 
$isFound = $sth->fetchAll(); 
if ($isFound) 
{ 
    // User entered correct username and password. 
    echo 'ALLOW'; 
} 
0

我建議你只做一次這樣的事情,當用戶第一次訪問該頁面,然後設置一個$ _SESSION ['is_admin']或其他時間,這樣你就不會必須爲每個頁面調用一個額外的數據庫。

+1

如果在瀏覽過程中權限發生了變化,該怎麼辦? – 2010-12-01 17:21:02

+0

如果權限發生變化,我假設有一個登錄過程,然後可以設置會話變量。 – 2010-12-01 17:22:10

3

您可以在您的登錄頁面(或任何檢查登錄頁的頁面)上設置會話變量,以存儲它們是否已登錄,並且會保留在頁面之間。然後你可以簡單的包裝你的管理員HTML中的if語句,像這樣:

<?php 
if ($_SESSION['isAdmin'] == true) { 
?> 
<p>My admin html</p> 
<?php 
} else { 
?> 
<p>My non-admin html</p> 
<?php 
} 
?> 

要保存信息在會話中,只需添加這,你必須echo("ALLOW");部分:
$ _SESSION [「isAdmin」] = true;

您還需要將session_start();添加到腳本的頂部。

+0

我認爲這可能是完成OP之後的最簡單的方法。我不是一個PHP人,但如果這就像ASP一樣,那麼只有當滿足條件時纔會呈現html,它只向管理員顯示內容。 – Delebrin 2010-12-01 17:24:50

0

你總是可以把你的「somepage.php」 以上文檔根目錄。這是防止直接執行的常用方法。例如,如果你的web服務器看起來像'project/public_html/index.php',那麼把你的管理專用包含在'project/somepage.php'中,然後用include(「../ somepage.php」 「)。

顯然這需要根據您使用的真實路徑進行調整。

相關問題