我是php的新手,我正在试图弄清楚如何使用会话检查并查看用户是否登录到网站,以便他们有权访问特定页面。
这是一件复杂的事情,还是因为我是一个无法理解的菜鸟?
谢谢您的帮助!
登录不是太复杂,但有一些特定的部分,几乎所有登录过程都需要。
首先,确保在需要了解登录状态的所有页面上启用会话变量,方法是将其放在这些页面的开头:
session_start();
接下来,当用户通过登录表单提交用户名和密码时,通常会通过查询包含用户名和密码信息的数据库(如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
}
然后,在依赖于登录状态的页面上,输入以下内容(不要忘记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.";
}
这些是基本组成部分。如果您需要有关SQL方面的帮助,可以在网上找到很多教程。
在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>
在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;
}
在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.";
}
在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 ;
在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>
在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!"
}
您要执行会话检查的任何页面都需要从以下开始:
session_start();
从那里,您检查会话数组中是否有表明他们已登录的变量:
if (!$_SESSION["loggedIn"]) redirect_to_login();
记录它们只不过是设置该值:
$_SESSION["loggedIn"] = true;
此页面上的几乎所有答案都依赖于检查会话变量的存在以验证用户登录。这绝对没问题,但重要的是要考虑如果同一裸机上有多个虚拟主机/站点,PHP会话状态对于您的应用程序并不是唯一的。
如果您在Web服务器上有两个PHP应用程序,它们都在一个名为“isLoggedIn”的会话变量中使用布尔标志检查用户的登录状态,那么用户可以登录其中一个应用程序,然后在没有凭据的情况下自动获得对第二个应用程序的访问权限。
我怀疑即使是商业共享托管中最恐龙也不会让虚拟主机以这样的方式共享相同的PHP环境,这种情况可能发生在多个客户站点(不再是),但在您自己的环境中需要考虑。
非常简单的解决方案是使用标识应用程序的会话变量而不是布尔标志。例如$ SESSION [“isLoggedInToExample.com”]。
资料来源:我是一名渗透测试员,在你不应该做的事情上有很多经验。
else if (isset($_GET['actie']) && $_GET['actie']== "aanmelden"){
$username= $_POST['username'];
$password= md5($_POST['password']);
$query = "SELECT password FROM tbl WHERE username = '$username'";
$result= mysql_query($query);
$row= mysql_fetch_array($result);
if($password == $row['password']){
session_start();
$_SESSION['logged in'] = true;
echo "Logged in";
}
}
请参阅此脚本以进行注册。简单易懂。
<?php
define('DB_HOST', 'Your Host[Could be localhost or also a website]');
define('DB_NAME', 'databasename');
define('DB_USERNAME', 'Username[In many cases root but some sites offer MySql Page where the username might be different]');
define('DB_PASSWORD', 'whatever you keep[if username is root then 99% password is blank]');
$link = mysql_connect(DB_HOST, DB_USERNAME, DB_PASSWORD);
if (!$link) {
die('Could not connect line 9');
}
$DB_SELECT = mysql_select_db(DB_NAME, $link);
if (!$DB_SELECT) {
die('Could not connect line 15');
}
$valueone = $_POST['name'];
$valuetwo = $_POST['last_name'];
$valuethree = $_POST['email'];
$valuefour = $_POST['password'];
$valuefive = $_POST['age'];
$sqlone = "INSERT INTO user (name, last_name, email, password, age) VALUES ('$valueone','$valuetwo','$valuethree','$valuefour','$valuefive')";
if (!mysql_query($sqlone)) {
die('Could not connect name line 33');
}
mysql_close();
?>
确保使用phpMyAdmin制作所有数据库内容。它是一个非常容易使用的工具。你可以在这里找到它:http://www.phpmyadmin.net/home_page/index.php
你可以做一个会话并放置它:
//start session
session_start();
//check do the person logged in
if($_SESSION['username']==NULL){
//haven't log in
echo "You haven't log in";
}else{
//Logged in
echo "Successfully log in!";
}
注意:你必须制作一个包含$_SESSION['username'] = $login_input_username;
的表格
在检查当前会话之前需要在所有页面上
session_start();
检查$_SESSION["loggedIn"
](不是)是否为true - 如果不是,则将它们重定向到登录页面。
if($_SESSION["loggedIn"] != true){
echo 'not logged in';
header("Location: login.php");
exit;
}
<?php
session_start();
if(!isset($_SESSION["login"]) && $SESSION["login"] =="OK")){
header("Location: index.php");
exit;
?>