简单if()不按预期工作

时间:2012-06-15 19:39:58

标签: php mysql login login-control login-script

我确信我只是在忽视某些事情,我花了几天时间研究这个问题,似乎无法弄明白。

登录上一页后,我会收到用户名和密码,

$username = mysql_escape_string($_POST['adminusername']);
$password = mysql_escape_string($_POST['adminpassword']);

然后我去数据库从数据库中提取用户名和密码,

$sql = "SELECT username, password FROM `weaponsadmin`";
$rows = $db->query($sql); while ($record = $db->fetch_array($rows)) {

现在这里是令我困惑的部分,如果我有以下内容,无论我使用什么用户名或密码,它都不允许我登录,

if ( ($record[username]==$username) && ($record[password]==$adminpassword) ){
   $_SESSION['loggedin'] = true;
   $_SESSION['username'] = $adminusername;
   header( "Location: admin.php" ) ;
}
else {
   header( "Location: index.php?login=error" ) ;
}

但是,如果我使用以下内容,它将允许我登录,如果用户名是正确的,但它允许我输入任何密码,它可以工作,

$adminusername = $record[username]; 
$adminpassword = $record[password];

if ( ($adminusername==$username) && ($adminpassword==$adminpassword) ) {
   $_SESSION['loggedin'] = true;
   $_SESSION['username'] = $adminusername;
   header( "Location: admin.php" ) ;
}
else {
   header( "Location: index.php?login=error" ) ;
}

总而言之,由于某种原因,&&部分似乎无法正常工作,如果有人可以帮助我使用代码并让我知道我的代码可以在哪里得到改进以获得更好的安全性以及如何使用工作正常,谢谢

6 个答案:

答案 0 :(得分:3)

这里有什么意义$adminpassword==$adminpassword

我认为应该是:

if ( ($adminusername==$username) && ($adminpassword==$password) ){

答案 1 :(得分:1)

$record[username]应为$record["username"](依此类推)。索引是字符串或int

答案 2 :(得分:1)

您使用的阵列错误。
您期望:$record[username]; //retrieve contains of key "username"
真正发生的事情:

    $record[username]; 
    /* 
         retrieves a key in the record array under the key which is a value of a
         constant named "username" (if it's defined) and an empty string with 
         E_WARNING if it's not. 
    */



您需要单引号或双引号索引名称,例如$records['username']。 但是,您可以在字符串中使用不带引号的数组索引(这些索引将按预期工作) - > $someString = "Blahblahblah, ergo $record[username] is a donkey.";

答案 3 :(得分:0)

您可以使用===代替==。阅读this
这里不需要strcmp()。

答案 4 :(得分:0)

要添加到迈克尔的答案,你不应该使用==进行字符串比较(希望这将有助于你在将来导航类似的困难)的原因是当你在一个对象上调用一个简单的==(例如在大多数语言中,字符串,或者除了int,double,float,char,long,short或boolean之外的任何东西),你真正要比较的是每个对象的内存中的地址,即指针值。

如果您想知道两个变量是否引用同一个对象,这很有用,但如果您想知道两个对象是否相同则不太有用。所以这是真的:

$string_a = $some_string;
$string_b = $some_string;
$string_a == $string_b;

但这不是:

$string_a = getUserInput();  # user types in "hello"
$string_b = getUserInput();  # user types in "hello"
$string_a == $string_b;

这可能是真的,这取决于你所使用的语言,如果它将字符串文字存储在内存中,而与它们所附加的用户定义变量无关:

$string_a = "hello";
$string_b = "hello";
$string_a = $string_b;

因此,除非您检查两个对象是否实际上是同一个对象,而不仅仅是相同的对象,否则请使用与我之前建议的对象来比较两者。这样的函数通常会降低到原始类型的级别,可以使用==进行比较,如果所有这些比较都会返回true。

答案 5 :(得分:-1)

不要使用==进行字符串比较。相反,请使用strcmp()===来匹配字符串。