2012-01-28 152 views
1

我使用下面的PHP代码进行登录而不使用数据库。
它重定向在两种情况home.php:
1.当我输入正确的用户名和密码
2. 当我输入任何字符/秒为用户名(除了真实的用户名)和密码保留文本框为空。不使用数据库的PHP登录脚本

在其他情况下,除了第二种情况,代码正常工作。
如何使代码在第二种情况下正常工作?

<?php 
session_start(); 

$userinfo = array(
       'user1'=>'pass1', 
       ); 

if(isset($_GET['logout'])) { 
    $_SESSION['username'] = ''; 
    header('Location: ' . $_SERVER['PHP_SELF']); 
} 

if(isset($_POST['username'])) { 
    if($userinfo[$_POST['username']] == $_POST['password']) { 
     $_SESSION['username'] = $_POST['username']; 

     header('Location: home.php'); 
    }else { 
     header('Location: login.php'); 
    } 
} 
?> 
+1

为什么你使用这一行'if($ userinfo [$ _ POST ['username']] == $ _POST ['password'])'? – Lion 2012-01-28 19:37:58

+0

它检查输入的用户名和密码是否与持有username =>密码组合的'$ userinfo'数组相匹配。 – drew010 2012-01-28 19:41:57

+0

哦!我从来没有在PHP中看到过这样的表达式,因为我来自Java环境,并且想知道关于它的一些情况。 – Lion 2012-01-28 19:47:09

回答

2

你可以改变

if($userinfo[$_POST['username']] == $_POST['password']) { 

if(isset($userinfo[$_POST['username']]) && $userinfo[$_POST['username']] == $_POST['password']) { 

它失败的原因是因为如果输入的用户名不是你的阵中,$用户信息[ 'idontexist']回报null,它的计算结果是一个空字符串,所以你最终比较null == ''这是真的。

使用修改的代码,您首先检查以确保输入的用户名实际存在于您的数组中。如果没有,密码检查从不运行,它们被重定向到登录页面。

您也可以使用===比较两者,但在某人编辑表单并删除密码字段以便$_POST['password']变为null并输入不存在的用户时最终会比较null为空,这将允许他们登录。使用isset检查以确保用户名存在于数组中,然后比较密码。

只是为了安全起见,您可能需要检查密码是否为空,并跳过密码检查并立即返回到登录页面。

编辑: 为了让你想要的2例,尝试:

if ((isset($userinfo[$_POST['username']]) && $userinfo[$_POST['username']] == $_POST['password']) || (!isset($userinfo[$_POST['username']]) && strlen($_POST['username']) > 0 && $_POST['password'] === '') {

这用来检查用户名是数组中,如果因此要确保密码匹配或检查用户名不在数组中,并确保密码为空。

+0

这不会检查“当我输入任何caracter/s作为用户名(真实useraname除外)并将密码文本框留空。” – 2012-01-28 19:43:06

+0

嗯,我想我误解了这个问题。我不确定你为什么要允许使用错误的用户名和密码进行登录。所以我的回答是无效的。 – drew010 2012-01-28 19:48:45

+0

首先阅读要求的问题...“它重定向到home.php在两种情况下:” – 2012-01-28 19:49:14