PHP скрипт скрипта проблемы с проверкой, если пользователь забанен - PullRequest
0 голосов
/ 03 января 2012

Я получаю ошибки с помощью сценария входа PHP, который я использую на своем сайте.

Я хотел добавить код, который проверяет, заблокирован ли пользователь при входе в систему.

Но по какой-то причине он не работает должным образом;он всегда выводит «Вы забанены», даже если поле / атрибут запрета содержит «n» для false в таблице «пользователи» MySQL.

Я пытался исправить код, но все равно получаю ошибки,Это мой код:

$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, с которым я должен проверять, называется "ban", а значение равно "y" для "true" или "n" для "false".

Ответы [ 6 ]

5 голосов
/ 03 января 2012

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! = User

Вы не должны сравнивать 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(), потому что она возвращает ассоциативный массив .

Это вернет ассоциативный массив для каждой возвращенной строки (содержащейся в ресурсе 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');
}
0 голосов
/ 03 января 2012

Чтобы подвести итог и развернуть, присваивание / сравнение и неправильный столбец в предложении SQL WHERE - это ошибки, которые каждый может совершать время от времени.Фрагмент кода все еще не работает.

В документации PHP для 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...');
}

Это хороший метод, если вам просто нужно проверить что-то определенное количество раз, и вам не нужны данные.

0 голосов
/ 03 января 2012
$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

0 голосов
/ 03 января 2012
  1. Узнайте о хакерских атаках с использованием SQL-инъекций.Иди и сделай это сейчас.
  2. Проверяете ли вы правильный столбец в своем первоначальном заявлении?Разве это не должно быть "SELECT * FROM users WHERE username =" или что-то еще?(как говорит tveitan)
  3. $ ban - это массив.Вам нужно $ ban ['ban'] вместо этого, чтобы получить столбец запрета.(как говорит анимусон)
  4. Для сравнения == не = (как говорит Адам)
0 голосов
/ 03 января 2012
$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"

0 голосов
/ 03 января 2012
if ($ban = 'y') {{ 

должно быть

if ($ban == 'y') {
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...