2016-06-09 110 views
0

我已經在PHP中創建了一個可以正常工作的登錄表單,但是我意識到我的用戶所指向的頁面仍然可以被任何人訪問。我如何繼續保護頁面,使其只能被登錄到網站的用戶訪問?只爲登錄用戶登錄表單和保護頁面?

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

我已經嘗試了很多不同的事情,但不知道發生了什麼。這是我到目前爲止!

checking_login.php

<?php 
ob_start(); 
$host=""; // Host name 
$username=""; // Mysql username 
$password=""; // Mysql password 
$db_name=""; // Database name 
$tbl_name=""; // Table name 

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

// Define $myusername and $mypassword 
$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); 

// Mysql_num_row is counting table row 
$count=mysql_num_rows($result); 

// If result matched $myusername and $mypassword, table row must be 1 row 
if($count==1){ 

// Register $myusername, $mypassword and redirect to file "login_success.php" 
$_SESSION['username'] = $myusername; 
$_SESSION['password'] = $mypassword; 
header("location: portkey.php"); 
} 
else { 
echo "Wrong Username or Password. "; 
} 
ob_end_flush(); 
?> 

這裏就是我說的太重定向頁面的頁面的一部分。 (它仍然向大家公開)。

<?php 
session_start(); 
$host=""; // Host name 
$username=""; // Mysql username 
$password=""; // Mysql password 
$db_name=""; // Database name 
$tbl_name="members"; // Table name 

    session_start(); 
    if(!isset($_SESSION['myusername'])) { 
     header("location:login.php"); 
    } 
?> 

登錄是帶有表單的頁面。表/用戶。

<table width="300" border="0" align="center" cellpadding="0" cellspacing="1"> 
<tr> 
<form name="form1" method="post" action="checking.php"> 
<td> 
<table width="100%" border="0" cellpadding="3" cellspacing="1"> 
<tr> 
</tr> 
<tr> 
<td width="78">Username</td> 
<td width="0">:</td> 
<td width="294"><input name="myusername" type="text" id="myusername"></td> 
</tr> 
<tr> 
<td>Password</td> 
<td>:</td> 
<td><input name="mypassword" type="text" id="mypassword"></td> 
</tr> 
<tr> 
<td>&nbsp;</td> 
<td>&nbsp;</td> 
<td><input type="submit" name="Submit" value="Login"></td> 
</tr> 
</table> 
</td> 
</form> 
</tr> 
</table> 
+0

刪除第二個電話到您的受保護頁面中的'session_start()' – Dale

+1

您不打算與此相處,對嗎? –

回答

0

您需要檢查是否username isset:

if(!isset($_SESSION['username'])) { 
     header("location:login.php"); 
    } 

此外,您呼叫session_start();兩次。然而第二個電話會被忽略。

提示:您應該將用戶id存儲在會話中,而不是存儲用戶名和密碼。

0

您不會在checking_login.php上開始會話。將您的代碼更改爲:

session_start(); 
$_SESSION['username'] = $myusername; 
$_SESSION['password'] = $mypassword; 

您不需要在受保護的頁面上兩次啓動會話。刪除if聲明之上的session_start();

此外......在您的受保護頁面上,您正在檢查不存在的會話!更改if(!isset($_SESSION['myusername'])) {if(!isset($_SESSION['username'])) {

0

的原因,您的會員專用頁面仍然可見,任何人都可以訪問的,因爲你沒有正確地檢查,如果有一個user session集。

爲了讓你的代碼工作,你需要改變你的條件語句:

if(!isset($_SESSION['myusername'])) { 
    header("location:login.php"); 
} 

到:

if(!isset($_SESSION['username'])) { 
    header("location: login.php"); 
} 

因爲myusername是不是你存入您的會話變量。

引用您的$_SESSION的設置:

$ _SESSION [ '用戶名'] = $名爲myUsername;

當您設置$_SESSION您使用username而不是myusername。檢查是否設置了$_SESSION時一定要堅持。

爲了讓你的頁面,你的願望,你必須使用以下格式的工作:通過改變else部分再次

<?php session_start(); ?> 
<!DOCTYPE html> 
<html> 
    <head></head> 
    <body> 
     <?php 
      // Check if user session is set. If it is redirect to login.php. 
      if(!isset($_SESSION['username'])): 
       header("location: login.php"); 

      // If it is not set show the your login form. 
      else: 
     ?> 

     <!--Your HTML code for the form.--> 

     <?php 
      endif; 
     ?> 
    </body> 
</html> 

如果你的登錄表單是在另一個頁面,那麼你就可以重定向如圖所示:

// If it is not set show the your login form. 
else: 
    header("location: loginform.php"); // The name of the file 
endif; 
0

如果你有一個全球性的header.php文件,然後在檢查如果$_SESSION['username']設置。如果是,則設置爲$logged_in = true,如果不是,則設置爲$logged_in = false。這是我用於我的網站。如果你不使用header.php,那麼在頁面檢查$_SESSION['username']。對於這兩個,如果$looged_in = trueisset($_SESSION['username']),那麼不要重定向。但是如果$logged_in = false!isset($_SESSION['username'])那麼你重定向它們。您也可以設置$_SESSION['logged_in']變量。

一些代碼來幫助。

header('location: page.php'); // REDIRECT VIA PHP 

// IF YOU HAVE header.php 
if(isset($_SESSION['username'])) $logged_in = true; // IN herder.php 
else $logged_in = false; // IN herder.php 

if($logged_in != true) header('location: login.php') // IN USERS ONLY PAGE 

// IF YOU DON'T HAVE header.php 

// OPTION 1 
if(!isset($_SESSION['username'])) header('location: login.php'); // IN USERS ONLY PAGE 

// OPTION 2 
$_SESSION['logged_in'] = true; // WHEN THE USER HAS LOGGED IN 

if($_SESSION['logged_in'] != true) header('location: login.php'); // IN USERS ONLY PAGE