2012-12-13 18 views
3

我正在使用後端的登錄頁面創建內容管理網站。用於在多個頁面上進行用戶驗證的Php會話變量

我已經爲內容管理系統的主菜單創建了一個工作登錄頁面。

下圖顯示我的代碼。

第一步 - 用戶訪問內容管理系統主菜單的URL: 代碼如下所示

<?php 
session_start(); 

echo $_SESSION['valid_user']; 

if(!isset($_SESSION['valid_user'])) 
{ 
$URL="error.php"; 
header("Location: $URL"); 
} 
    ?> 

可能發生兩件事情。 1如果他們沒有登錄,他們將被引導到錯誤頁面。 然後他們可以選擇訪問登錄頁面並使用他們的用戶名和pswd登錄。

我已經聲明?php start_session();?在頂部

<?php 

$login = $_POST['name']; 
$loginpass =$_POST['password']; 

if((isset($login)) || (isset($loginpass))){ 

    //echo "<p> form has been submitted</p>"; 

    include("connect.php"); 

    $query = "select * from logins where 
     username='$login' and pswd=MD5('$loginpass')"; 
     $result = mysql_query($query) or die($query."<br/><br/>".mysql_error()); 

    $count=mysql_num_rows($result); 
    echo $count; 

if($count > 0){ 

    echo "<p>you are logged in as $login please 
    go to <a href='home2.php'>edt  home</a>.</p>"; 
    echo "<p><a href='logout.php'>log out</a> $login?</p>"; 
    $_SESSION['valid_user'] = $login; 

}else{ 

    echo "<p>sorry login failed</p>"; 

} 

    }else{ 

    //echo "<p> form hasn't been submitted</p>"; 
    //Visitor needs to enter a name and password     
    echo "<h1>Please Log In</h1> <form method='post' action='index2.php'>"; 
    echo "<p>Username: <input type='text'name='name'></p>"; 
    echo "<p>Password: <input type='password' name='password'></p>"; 
    echo "<p><input type='submit' name='submit' value='Log In'></p></form>";   
} 


?> 

到目前爲止,所有這些功能對我來說都很好。

但是,我想確保如果用戶繞過主頁url並決定直接跳到編輯菜單中的某個部分,他們將被迫登錄,如果他們還沒有,或者,PHP將檢查他們的憑據,如果他們已經登錄。

這是我在頁面頂部的代碼的一個示例我想要我的驗證ont。我不確定在頂部是否已經有數據庫表連接會影響會話變量。

<?php 

include("connect.php"); 
//echo "all good here"; 


//grab the data from the table 'designs' 
$query ="SELECT * FROM designs ORDER BY id"; 


//send SQL statement to MySQL server 
$display = mysql_query($query); 
$num = mysql_numrows($display); 


mysql_close(); 
?> 

我知道我想要放置PHP腳本的所有檢查「vaild_user」會話變量設置,也給用戶所指向的文件logout.php註銷的能力PHP頁面。我只是不確定如何去做這件事。

對於所有這些,我都很新穎,並且通常在明確的指導下明白,就像大多數人一樣。

任何人都可以提供幫助將不勝感激

再次感謝!

+1

請淨化你的數據庫輸入其他人做任何事情之前:http://roshanbh.com.np/2007/12/sql-injection -attack-examples-and-preventions-in-php.html – span

回答

5

基本上你只需要在你的每一個「受保護」的網頁是這樣的片段:

<?php 

session_start(); 
if (!isset($_SESSION['valid_user'])) { 
    header("Location: login.php"); 
    exit(); 
} 
?> 
<a href="logout.php">Logout</a> 

如果他們登錄,他們得到了註銷鏈接和頁面的其餘部分。如果他們沒有登錄,他們會被重定向到登錄頁面。

會話不受數據庫連接或任何其他代碼的影響。他們ARE受到開始會話之前執行輸出的影響,或嘗試執行重定向。這會觸發「無法修改標題 - 輸出在XXX行開始」警告並禁用重定向。

+0

感謝您的回覆,您提供的代碼很有意義,我將它放置在受保護頁面的頂部,但我仍然觸發我無法修改標題 - 輸出啓動錯誤。這讓我感到困惑,因爲在我開始會議之前我沒有做任何事情。 :/ – user1901127

+0

任何在php''之外的代碼塊(包括unicode BOM)都可以觸發輸出 –

+0

您的意思是超出之外的任何內容因爲我的代碼的myline從字面上開始,沒有其他任何東西在其後面。它在我編輯的第一行。 ... <?php session_start(); (!isset($ _ SESSION ['valid_user'])){ header(「Location:login.php」); exit(); } ?> – user1901127

1

您應該只需在將用戶的信息提交到登錄頁面後驗證用戶的憑據。然後你可以設置一個會話變量(這裏看起來你使用的是$valid_user,如果這個變量存在,那麼它們已經被認證了。

出於安全原因,您實際上從未將系統密碼存儲在系統的任何位置。您應該在登錄頁面上散列他們的密碼輸入,然後將其與散列數據庫值進行比較。

爲了增加安全性(例如,當您從註冊的用戶內容移動到管理內容時,您可以多次登錄一次),但對於通用安全性來說這不是必需的。

這是否回答你的問題?

+0

我將如何爲每個頁面上的$ valid_user設置會話變量?道歉,我是新手。 Thankyou雖然你的答覆。 – user1901127

0

使用每個頁面頂部()的全局變量的session_start後

$_SESSION['username'];