0

我确信我只是忽略了一些东西,我花了几天的时间来解决这个问题,但似乎无法弄清楚。

在上一页登录后,我得到用户名和密码,

$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" ) ;
}

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

4

6 回答 6

3

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

我认为应该是:

if ( ($adminusername==$username) && ($adminpassword==$password) ){
于 2012-06-15T19:42:05.917 回答
1

$record[username]应该是$record["username"](等等)。索引是字符串或整数

于 2012-06-15T19:41:50.513 回答
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.";

于 2012-06-15T19:57:13.640 回答
0

您可以使用===而不是==. 读这个
strcmp() 在这里不需要。

于 2012-06-15T19:54:30.163 回答
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。

于 2012-06-15T19:55:44.973 回答
-1

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

于 2012-06-15T19:45:23.890 回答