2

假设我想为单个用户制作一个超级简单的页面,在 php 中限制访问。假设授权用户知道页面的目录和 url,他是否可以通过geturl 栏中的方法手动传递用户名和密码(他会知道),并根据脚本自动检查,其中的值的用户名和密码将被硬编码?该脚本有一个if statement如果不是真的,就不会显示内容。可能有什么缺陷?

网址

http://example.com/admin.php?user=admin&password=1324

管理员.php

<?php if($_GET['user'] == 'admin' && $_GET['password'] == '1324')){
// display content here
}else{
echo "You're not authorized to visit this page";
} ?>

场景二: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";
} ?>
4

3 回答 3

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.

}

这样做的好处是:

  • 用户端没有存储密码
  • 关闭浏览器时过期的会话密钥
  • 密码只能通过互联网传递一次
于 2012-08-24T23:05:51.297 回答
1

是的,它可以,GET必须POST从表单传递。由于许多原因,这不是一种安全的方式。

但是,是的,根据您的需要,它可以通过GET. 只需一个 URL,他就可以跳入禁区。

顺便说一句,当您检查用户名和密码时:

if($_GET['user'] == 'admin' && $_GET['password'] == '1324' && $_GET['password'] != '' && $_GET['username'] != '')

您可以排除最后一部分,因为您已经在验证数据

if($_GET['user'] == 'admin' && $_GET['password'] == '1324')
于 2012-08-24T22:51:33.260 回答
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
}

它可以被调用

http://用户名:secret@thepage.com

于 2012-08-24T23:44:25.900 回答