PHP登录脚本问题,检查用户是否被禁止

时间:2012-01-02 22:02:12

标签: php mysql login

我在我的网站上使用的PHP登录脚本出错了。

我想添加一些代码,用于检查用户在登录时是否被禁止。

但由于某些原因,它不能正常工作;即使禁止字段/属性在MySQL“users”表中包含“n”为false,它也总是输出“你被禁止”。

我已经尝试修复代码,但我仍然遇到错误。这是我的代码:

$bancheck = mysql_query("SELECT * FROM users WHERE ban = '".$_POST['username']."'" ) or die(mysql_error());
$ban = mysql_fetch_array($bancheck);    

if ($ban = 'y') {
  die('You are banned...');
}

我要检查的MySQL字段称为“禁止”,值为“y”表示“true”,或“n”表示“false”。

6 个答案:

答案 0 :(得分:5)

1:应该是比较,而不是作业。

此行不正确:

if ($ban = 'y') {{

应该是:

if ($ban == 'y') {

我假设那里也有一个额外的支撑。


2:SQL注入

您不应将字符串from $_POST直接传递到MySql中,因为您容易受到SQL注入攻击。你应该像这样逃避:

$bancheck = mysql_query("SELECT * FROM users WHERE ban = '".mysql_real_escape_string($_POST['username'])."'" )or die(mysql_error());

3:禁止!=用户

你不应该将ban与通过表单传入的用户名进行比较,因为ban会保留字符串'y'或'n'。您应该将用户名(传入)与数据库表中的approriate username字段进行比较。像这样:

$bancheck = mysql_query("SELECT * FROM users WHERE username = '".mysql_real_escape_string($_POST['username'])."'" )or die(mysql_error());

4:正确的迭代&比较

我使用mysql_fetch_array()函数而不是mysql_fetch_assoc()函数,因为它返回associative array

这将为返回的每一行(包含在MySql资源$bancheck中)返回一个关联数组,因此您需要迭代它们(即使它应该只返回一个数组),如下所示:

while($ROW = mysql_fetch_assoc($bancheck))
{
    if('y' == $ROW['ban']) {

        die('You are banned...');

    }
}

但是我会添加一些代码来帮助解决任何其他问题:

$count = mysql_num_rows($bancheck);
if($count > 1)
{
    die('More than one user with that username');    
}
elseif($count > 0)
{
    while($ROW = mysql_fetch_assoc($bancheck))
    {
        if('y' == $ROW['ban']) {

            die('You are banned...');

        }
    }
}
else //i.e. $count<=0
{
    die('No users with that username');
}

答案 1 :(得分:0)

if ($ban = 'y') {{ 

应该是

if ($ban == 'y') {

答案 2 :(得分:0)

$bancheck = mysql_query("SELECT * FROM users WHERE ban = '".$_POST['username']."'" )or die(mysql_error());

我认为应该是:

$bancheck = mysql_query("SELECT ban FROM users WHERE username = '".$_POST['username']."'" )or die(mysql_error());

如果username的列名为“username”

答案 3 :(得分:0)

  1. 了解SQL注入黑客攻击。去做吧。
  2. 你在检查吗? 您的初始声明中的右栏?它应该不是“SELECT * 来自用户WHERE username =“或者其他什么?(如tveitan所说)
  3. $ ban是​​一个数组。你需要 $ ban ['ban']取而代之的是获得禁令栏。 (正如animuson所说)
  4. 为了比较==不=(如亚当所说)

答案 4 :(得分:0)

$bancheck = mysql_query("SELECT banned FROM users WHERE username = '". mysql_real_escape_string($_POST['username']) ."'") or die(mysql_error());
$ban = mysql_fetch_array($bancheck);    

if($ban['banned'] == 'y') {
    die('You are banned...');
}

banned$ban['banned'])的字段为“y”或“n”。 但是检查$_POST['username']是否有mysql注入尝试。见https://www.owasp.org/index.php/SQL_Injection_Prevention_Cheat_Sheet

答案 5 :(得分:0)

回顾和扩展,SQL WHERE子句中的赋值/比较和错误的列是任何人都会犯错的错误。但是,代码片段仍然存在。

The PHP documentation for mysql_fetch_array表示该函数返回一个数组,其中包含数据库内部指针所在的行,而不仅仅是单个值。

我会做这样的事情

$username = do_some_injection_checking_or_escaping($_POST['username']);
$bancheck = mysql_query("SELECT * FROM users WHERE username = '".$username."' AND ban='y';") or die(mysql_error());

if(mysql_num_rows($bancheck) == 1) {
    die('You are banned...');
}

如果您只是需要检查某些内容并且您不需要数据,这是一个很好的方法。