如何防止用户绕过 php 身份验证
How to prevent user from bypassing php authentication
为了简单起见,我们称它为html1。
当用户转到 html1 时,会出现一个 login2.php 登录页面,允许访问 client.php 这是隐藏页面。
然后转到 checklogin.php...如果密码和用户名匹配...然后转到隐藏的 client.php 页面...如果不匹配...返回到主页。
用户必须登录才能查看隐藏 client.php 页面的内容。
然而,用户可以通过在地址栏中输入 ..../client.php 来访问 client.php...因此绕过授权页面并使其失效。我可以只输入 servername/client.php...它仍然会显示 client.php 的内容...但我希望 client.php...保密!
如何防止这种情况发生?
谢谢。
第一个登录页面...
<html>
<head>
<title>Login Form</title>
</head>
<body>
<h2>Login Form</h2>
<table>
<form method="post" action="checklogin2.php">
<div id="name">User Id: <input type="text" name="****"></div>
<div id="password">Password: <input type="password" name="*******"></div>
<div class="button"><input type="submit" value="Login"></div>
</form>
</table>
</body>
</html>
然后它去......
检查login2.php
<?php
$*** = $_POST['****'];
$***** = $_POST['***'];
if($uid == '****' and $***** == '*****')
{
session_start();
$_SESSION['sid']=session_id();
header("location:securepage.php");
}
else
{
header("location:index.html");
}
?>
然后去...
securepage.php
<?php
session_start();
if($_SESSION['sid']==session_id())
{
header("location:client.php");
echo "<a href='logout.php'>Logout</a>";
}
else
{
header("location:login.php");
}
?>
在每个页面的开头,您都必须检查用户是否已获得授权。
在 checklogin.php
如果用户输入了正确的登录名和密码,只需设置类似
的内容
$_SESSION['authorized'] = TRUE;
...在其他页面上,只需检查用户是否已获得授权:
if (isset($_SESSION['authorized']) && $_SESSION['authorized'] === TRUE) {
// Alright, let's show all the hidden functionality!
echo "Psst! Hey! Wanna buy some weed?";
} else {
// User is not authorized!
header('Location: login.php');
exit();
}
请注意,您不必弄乱 cookie、会话 ID 等 - 只需在所有内容之前添加 session_start()
并自由使用 $_SESSION
var.
这是会话的主要优点(尤其是 $_SESSION
变量):您可以记住同一网站上不同页面之间的一些数据。
所有页面都必须检查用户是否已授权。我会推荐使用对象,并且总是继承一个 class 来为你检查这个。到处都有相同的代码,做同样的事情并不有趣。
if($_SERVER["PHP_SELF"] == '/yourpagefolder/yourpage.php' && !isset($_SESSION['login_user'])){
header('location: login.php');
}
为了简单起见,我们称它为html1。
当用户转到 html1 时,会出现一个 login2.php 登录页面,允许访问 client.php 这是隐藏页面。
然后转到 checklogin.php...如果密码和用户名匹配...然后转到隐藏的 client.php 页面...如果不匹配...返回到主页。
用户必须登录才能查看隐藏 client.php 页面的内容。
然而,用户可以通过在地址栏中输入 ..../client.php 来访问 client.php...因此绕过授权页面并使其失效。我可以只输入 servername/client.php...它仍然会显示 client.php 的内容...但我希望 client.php...保密!
如何防止这种情况发生?
谢谢。
第一个登录页面...
<html>
<head>
<title>Login Form</title>
</head>
<body>
<h2>Login Form</h2>
<table>
<form method="post" action="checklogin2.php">
<div id="name">User Id: <input type="text" name="****"></div>
<div id="password">Password: <input type="password" name="*******"></div>
<div class="button"><input type="submit" value="Login"></div>
</form>
</table>
</body>
</html>
然后它去...... 检查login2.php
<?php
$*** = $_POST['****'];
$***** = $_POST['***'];
if($uid == '****' and $***** == '*****')
{
session_start();
$_SESSION['sid']=session_id();
header("location:securepage.php");
}
else
{
header("location:index.html");
}
?>
然后去... securepage.php
<?php
session_start();
if($_SESSION['sid']==session_id())
{
header("location:client.php");
echo "<a href='logout.php'>Logout</a>";
}
else
{
header("location:login.php");
}
?>
在每个页面的开头,您都必须检查用户是否已获得授权。
在 checklogin.php
如果用户输入了正确的登录名和密码,只需设置类似
$_SESSION['authorized'] = TRUE;
...在其他页面上,只需检查用户是否已获得授权:
if (isset($_SESSION['authorized']) && $_SESSION['authorized'] === TRUE) {
// Alright, let's show all the hidden functionality!
echo "Psst! Hey! Wanna buy some weed?";
} else {
// User is not authorized!
header('Location: login.php');
exit();
}
请注意,您不必弄乱 cookie、会话 ID 等 - 只需在所有内容之前添加 session_start()
并自由使用 $_SESSION
var.
这是会话的主要优点(尤其是 $_SESSION
变量):您可以记住同一网站上不同页面之间的一些数据。
所有页面都必须检查用户是否已授权。我会推荐使用对象,并且总是继承一个 class 来为你检查这个。到处都有相同的代码,做同样的事情并不有趣。
if($_SERVER["PHP_SELF"] == '/yourpagefolder/yourpage.php' && !isset($_SESSION['login_user'])){
header('location: login.php');
}