2011-07-24 75 views
6

我創建了一個很棒的登錄表單。但是我意識到我的用戶所指向的頁面仍然可以被任何人訪問。如何保護被訪問的頁面只能被登錄的用戶查看?如何僅爲登錄用戶保護頁面?

我是否需要在成功頁面上放置腳本?

這裏是我的check_login.php:

<?php 
$host="localhost"; // Host name 
$username="xxx"; // Mysql username 
$password="xxx"; // Mysql password 
$db_name="xxx"; // Database name 
$tbl_name="xxx"; // Table name 

// Connect to server and select database. 
mysql_connect("$host", "$username", "$password") or die("cannot connect"); 
mysql_select_db("$db_name")or die("cannot select DB"); 

// username and password sent from form 
$myusername=$_POST['myusername']; 
$mypassword=$_POST['mypassword']; 

// To protect MySQL injection (more detail about MySQL injection) 
$myusername = stripslashes($myusername); 
$mypassword = stripslashes($mypassword); 
$myusername = mysql_real_escape_string($myusername); 
$mypassword = mysql_real_escape_string($mypassword); 

$sql="SELECT * FROM $tbl_name WHERE username='$myusername' and password='$mypassword'"; 
$result=mysql_query($sql); 

$count=mysql_num_rows($result); 

$user_info = mysql_fetch_assoc($result); 

if(isset($user_info['url'])) { 

session_register("myusername"); 
session_register("mypassword"); 
    header('Location: ' . $user_info['url']); //Redirects to the supplied url from the DB 
} else { 
    header("location:error.htm"); 
} 
?> 
+2

不是你正在尋找的答案,但你會想要修復你的查詢,或者你可能有一個SQL注入攻擊,妥協你的數據庫。另外,在發送位置標題時,養成從腳本退出的習慣。 – sberry

+0

@ sberry2A:對於'exit'的建議,我沒有發現SQL的問題,只有+1。 – Dor

回答

6

每次你的頁面應該

session_start(); 

開始,你不應該使用session_register("variablename")作爲的PHP 4.2版,使用

$_SESSION["variable"] = value; 

所以例如頁面的登錄次數,它檢查會成爲:

<?php 
session_start(); 
if($_SESSION["loggedIn"] != true) { 
    echo("Access denied!"); 
    exit(); 
} 
echo("Enter my lord!"); 
?> 

和登錄腳本:

<?php 
    /* 
     ... db stuff ... 
    */ 

if(isset($user_info['url'])) { 
    $_SESSION["loggedIn"] = true; 
    $_SESSION["username"] = $myusername; 
    header('Location: ' . $user_info['url']); //Redirects to the supplied url from the DB 
} else { 
    header("Location: error.htm"); 
} 
?> 
2

在每一頁/內容有權限限制,您應該驗證客戶端/用戶。如果人們瘋了,那麼你必須讓用戶在每個頁面填寫他的詳細信息(用戶名/密碼),但是要感謝「HTTP cookies」 - 我們不必這樣做。

+0

所以我需要在頁面中放置一個腳本進行身份驗證,是的?劇本會是什麼樣子?它是JavaScript還是PHP? – Erik

+1

是的。它應該是PHP(JS沒用,因爲它是客戶端代碼) – Dor

+0

有沒有我能看到的例子? – Erik

3

在需要用戶登錄的頁面上檢查是否有有效會話。如果沒有發送到登錄頁面。

if (!$_SESSION['myusername']) 
{ 
    header('location: /login.php'); 
    exit; 
} 
+0

我是否將此代碼封裝在頁面頂部的JavaScript標記中? – Erik

+0

這是PHP。並且會在session_start()之後的頁面頂部。被稱爲 – plague

+0

我用你的腳本,但它不起作用。 – Erik

1

您應該基本上使用會話管理來跟蹤用戶是否處於已驗證的會話中。如果沒有,你(重新)引導他們到索引頁面;如果是的話,你授予他們訪問他們請求的資源。

要使用會話,把你的會話設置功能在您的應用程序內的每個PHP腳本頂部(設置功能,包括會話處理程序,Cookie域和cookie的名稱),並說session_start()。然後,檢查當前會話中是否已定義登錄標誌,如$_SESSION["user_is_logged_in"]。在認證頁面中,您當然可以在某個階段定義$_SESSION["user_is_logged_in"] = true;

相關問題