如何检查用户是否在php中登录?

And*_*rew 44 php session login session-state

我是php的新手,我正在试图弄清楚如何使用会话检查并查看用户是否登录到网站,以便他们有权访问特定页面.

这是一件复杂的事情,还是因为我是一个无法理解的菜鸟?

谢谢您的帮助!

Ben*_*ell 91

登录不是太复杂,但有一些特定的部分,几乎所有登录过程都需要.

首先,确保在需要了解登录状态的所有页面上启用会话变量,方法是将其放在这些页面的开头:

session_start();
Run Code Online (Sandbox Code Playgroud)

接下来,当用户通过登录表单提交用户名和密码时,通常会通过查询包含用户名和密码信息的数据库(如MySQL)来检查用户名和密码.如果数据库返回匹配项,则可以设置会话变量以包含该事实.您可能还想包含其他信息:

if (match_found_in_database()) {
    $_SESSION['loggedin'] = true;
    $_SESSION['username'] = $username; // $username coming from the form, such as $_POST['username']
                                       // something like this is optional, of course
}
Run Code Online (Sandbox Code Playgroud)

然后,在依赖于登录状态的页面上,输入以下内容(不要忘记session_start()):

if (isset($_SESSION['loggedin']) && $_SESSION['loggedin'] == true) {
    echo "Welcome to the member's area, " . $_SESSION['username'] . "!";
} else {
    echo "Please log in first to see this page.";
}
Run Code Online (Sandbox Code Playgroud)

这些是基本组成部分.如果您需要有关SQL方面的帮助,可以在网上找到很多教程.

  • 缺少对isset的调用中的括号:if(isset($ _ SESSION ['loggedin'])&& $ _SESSION ['loggedin'] == true)... (2认同)
  • 感谢您解释这一点。我想知道是否可以限制文件夹而不是页面?所以除非您登录,否则我在该文件夹中的任何页面都受到限制? (2认同)

Tro*_*son 19

在Login.html中:

<html>
<head>
  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
  <title>Login Form</title>
</head>
<body>
  <section class="container">
    <div class="login">
      <h1>Login</h1>
      <form method="post" action="login.php">
        <p><input type="text" name="username" value="" placeholder="Username"></p>
        <p><input type="password" name="password" value="" placeholder="Password"></p>

        <p class="submit"><input type="submit" name="commit" value="Login"></p>
      </form>
    </div>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

在Login.php中:

<?php

$host="localhost"; // Host name 
$username=""; // Mysql username 
$password=""; // Mysql password 
$db_name=""; // Database name 
$tbl_name="members"; // 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");

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

// To protect MySQL injection (more detail about MySQL injection)
$username = stripslashes($username);
$password = stripslashes($password);
$username = mysql_real_escape_string($username);
$password = mysql_real_escape_string($password);
$sql="SELECT * FROM $tbl_name WHERE username='$username' and password='$password'";
$result=mysql_query($sql);

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

// If result matched $username and $password, table row must be 1 row
if($count==1){
    session_start();
    $_SESSION['loggedin'] = true;
    $_SESSION['username'] = $username;
}
Run Code Online (Sandbox Code Playgroud)

在Member.php中:

session_start();
if (isset($_SESSION['loggedin']) && $_SESSION['loggedin'] == true) {
    echo "Welcome to the member's area, " . $_SESSION['username'] . "!";
} else {
    echo "Please log in first to see this page.";
}
Run Code Online (Sandbox Code Playgroud)

在MYSQL中:

CREATE TABLE `members` (
`id` int(4) NOT NULL auto_increment,
`username` varchar(65) NOT NULL default '',
`password` varchar(65) NOT NULL default '',
PRIMARY KEY (`id`)
) TYPE=MyISAM AUTO_INCREMENT=2 ;
Run Code Online (Sandbox Code Playgroud)

在Register.html中:

<html>
<head>
<title>Sign-Up</title>
</head>
<body id="body-color">
<div id="Sign-Up">
<fieldset style="width:30%"><legend>Registration Form</legend>
<table border="0">
<form method="POST" action="register.php">
<tr>
<td>UserName</td><td> <input type="text" name="username"></td>
</tr>
<tr>
<td>Password</td><td> <input type="password" name="password"></td>
</tr>
<tr>
<td><input id="button" type="submit" name="submit" value="Sign-Up"></td>
</tr>
</form>
</table>
</fieldset>
</div>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

在Register.php中:

<?php

define('DB_HOST', '');
define('DB_NAME', '');
define('DB_USER','');
define('DB_PASSWORD','');

$con=mysql_connect(DB_HOST,DB_USER,DB_PASSWORD) or die("Failed to connect to MySQL: " .     mysql_error());
$db=mysql_select_db(DB_NAME,$con) or die("Failed to connect to MySQL: " . mysql_error());



$userName = $_POST['username'];
$password =  $_POST['password'];
$query = "INSERT INTO members (username,password) VALUES ('$userName','$password')";
$data = mysql_query ($query)or die(mysql_error());
if($data)
{
echo "YOUR REGISTRATION IS COMPLETED...";
}
else
{
echo "Unknown Error!"
}
Run Code Online (Sandbox Code Playgroud)

  • mysql_*在2014年? (9认同)
  • 不要使用此脚本。它已经过时并且容易受到注入攻击。 (5认同)
  • [mysql_real_escape_string 已弃用](http://php.net/manual/en/function.mysql-real-escape-string.php)。[改用 PDO](http://php.net/manual/en/ref.pdo-mysql.php)。 (3认同)

Sam*_*son 12

您要执行会话检查的任何页面都需要从以下开始:

session_start();
Run Code Online (Sandbox Code Playgroud)

从那里,您检查会话数组中是否有表明他们已登录的变量:

if (!$_SESSION["loggedIn"]) redirect_to_login();
Run Code Online (Sandbox Code Playgroud)

记录它们只不过是设置该值:

$_SESSION["loggedIn"] = true;
Run Code Online (Sandbox Code Playgroud)


hib*_*rn8 12

此页面上的几乎所有答案都依赖于检查会话变量的存在以验证用户登录.这绝对没问题,但重要的是要考虑如果同一裸机上有多个虚拟主机/站点,PHP会话状态对于您的应用程序并不是唯一的.

如果您在Web服务器上有两个PHP应用程序,它们都在一个名为"isLoggedIn"的会话变量中使用布尔标志检查用户的登录状态,那么用户可以登录其中一个应用程序,然后在没有凭据的情况下自动获得对第二个应用程序的访问权限.

我怀疑即使是商业共享托管中最恐龙也不会让虚拟主机以这样的方式共享相同的PHP环境,这种情况可能发生在多个客户站点(不再是),但在您自己的环境中需要考虑.

非常简单的解决方案是使用标识应用程序的会话变量而不是布尔标志.例如$ SESSION ["isLoggedInToExample.com"].

资料来源:我是一名渗透测试员,在你不应该做的事情上有很多经验.

  • 会话信息的安全性如何?据我所知,它存储在服务器上的“tmp”目录中。攻击者是否可以修改会话数据来登录?这是我应该关心的事情吗?另外,我应该避免在会话中存储加密密钥吗? (2认同)