仅为登录用户登录表单和保护页面?

时间:2016-06-09 15:01:34

标签: php html

我在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>

4 个答案:

答案 0 :(得分:0)

您需要检查username是否设置:

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

此外,您要拨打session_start();两次。然而,第二个电话将被忽略。

提示:您应该将用户id存储在会话中,而不是存储用户名和密码。

答案 1 :(得分:0)

您无法在checking_login.php上开始会话。将您的代码更改为:

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

您无需在受保护的页面上两次启动会话。删除session_start();语句上方的if

此外...在受保护的网页上,您正在检查不存在的会话!if(!isset($_SESSION['myusername'])) {更改为if(!isset($_SESSION['username'])) {

答案 2 :(得分:0)

您的仅限会员的页面仍然可见并且任何人都可以访问的原因是,因为您没有正确检查,是否设置了user session

要使代码正常工作,您需要更改条件语句:

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

为:

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

因为myusername不是您存储在会话中的变量。

引用$_SESSION的设置:

  

$ _ SESSION [&#39;用户名&#39;] = $ myusername;

当您设置$_SESSION时,您使用了username而不是myusername。检查是否设置了$_SESSION时,请务必坚持。

为了让您的页面按照您的意愿工作,您必须使用以下格式:

<?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>

如果您的登录表单位于其他页面中,则可以通过更改else部分重新定向,如下所示:

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

答案 3 :(得分:0)

如果您有全局header.php文件,则在该检查中是否设置了$_SESSION['username']。如果是,请设置$logged_in = true,如果不是,请设置$logged_in = false。它是我用于我的网站的东西。如果您不使用header.php,请在页面中检查$_SESSION['username']。对于两者,如果是$looged_in = trueisset($_SESSION['username']),那么DON&#39; T重定向。但是如果$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