我们假设我想在一个用户的php中创建一个超级简单的页面,限制访问。如果授权用户知道页面的目录和URL,他可以通过url栏中的get
方法手动传递用户名和密码(他知道),并根据脚本自动检查,其中用户名和密码的值将被硬编码?该脚本具有if statement
,如果不是,则不显示内容。有什么缺陷?
网址
http://example.com/admin.php?user=admin&password=1324
admin.php的
<?php if($_GET['user'] == 'admin' && $_GET['password'] == '1324')){
// display content here
}else{
echo "You're not authorized to visit this page";
} ?>
场景2:post
方法
与上述方案类似,在此方案中,授权用户将在表单中键入用户名,密码,该密码将在实际的admin.php
文件中处理。将使用类似的if statement
,这次使用$_POST[]
超全球来检查输入。
<?php if($_POST['user'] == 'admin' && $_POST['password'] == '1324'){
// display content here
}else{
echo "You're not authorized to visit this page";
} ?>
答案 0 :(得分:4)
两者都有缺陷。
如果您使用方法1,您最终会将传递给标题的变量保存在页面历史记录中,这意味着任何有权访问PC的人都可以搜索并查找它们,从而在此过程中为自己提供访问权限。搜索引擎也可以接收并保存链接,让它对世界开放。
如果你使用方法2,你需要每次重新发送POST数据 你访问一个安全的页面,这意味着你最终得到一堆按钮和表格链接可以已经足够了。但它确实消除了第一种方法的问题。
这两种方法的更好方法是使用$ _SESSION变量。这基本上允许数据存储在服务器端,同时为用户提供可用于控制数据访问的“密钥” - 默认情况下,此密钥存储在cookie中。
示例用法是:
//Say the user is "admin", and the password is "1234"
//This data could be used to 'log in' via post.
//First of all we start the session, and check to see if the user is logged in
//If the user has the session active, they'll have a cookie on their PC which links to it
session_start();
if ($_SESSION['login']==true || ($_POST['user']=="admin" && $_POST['pass']=="1234")) {
//If they already have a session, give them access.
//If not, check for posted UN & PW and if correct, give access.
$_SESSION['login']=true; //Set login to true in case they got in via UN & PW
//Do stuff for when logged in
}
else { //Not already logged in, not sent a password
//Give the user a login form redirecting to this page.
}
这样做的好处是:
答案 1 :(得分:1)
是的,GET
,POST
必须从表单传递。由于种种原因,这不是一种安全的方式。
但是,是的,根据您的需要,它可以通过GET
传递。使用单个URL,他可以跳进限制区域。
当您检查用户名和密码时BTW:
if($_GET['user'] == 'admin' && $_GET['password'] == '1324' && $_GET['password'] != '' && $_GET['username'] != '')
您可以排除最后一部分,因为您已经在验证数据
if($_GET['user'] == 'admin' && $_GET['password'] == '1324')
答案 2 :(得分:0)
像这样的东西
if (!isset($_SERVER['PHP_AUTH_USER'])) {
header('WWW-Authenticate: Basic realm="My Realm"');
header('HTTP/1.0 401 Unauthorized');
echo 'Text to send if user hits Cancel button';
exit;
} else {
$expectdUsername = 'username';
$expectedPassword = 'secret';
if($_SERVER['PHP_AUTH_USER'] != $expectdUsername ||
$_SERVER['PHP_AUTH_PW'] != $expectedPassword) {
echo 'Invalid username/password';
exit;
}
//Add a cookie, set a flag on session or something
//display the page
}
可以通过
调用