简单的单用户登录页面

时间:2012-08-24 22:45:37

标签: php authentication post login get

我们假设我想在一个用户的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";
} ?>

3 个答案:

答案 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)

是的,GETPOST必须从表单传递。由于种种原因,这不是一种安全的方式。

但是,是的,根据您的需要,它可以通过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
}

可以通过

调用

http://username:secret@thepage.com