Простой вход в PHP - num_rows - PullRequest
       12

Простой вход в PHP - num_rows

0 голосов
/ 13 февраля 2009

Я использую mysql_num_rows, чтобы проверить, возвращена ли одна строка для моего имени пользователя, и если count == 1, то войдите в систему, я получаю сообщение об ошибке, хотя ниже мой код идет после этого. Есть предложения?

Предупреждение: mysql_num_rows (): поставляется аргумент не является допустимым результатом MySQL ресурс в /home/web42001spring09/rcoughlin/public_html/process-login.php по линии 13

<?php
// include database info
include("config.php");

if(isset($_POST["submit"])){
    // get data from form
    $username = $_POST["user"];
    $password = $_POST["pass"];

    $query  = "SELECT username,password,id FROM login WHERE username=".$username." AND password=".$password." LIMIT 1";
    $result = mysql_query($query);

    $count  = mysql_num_rows($result);

    // if 1 then login them in set cookie and redirect
    if($count==1){
        setcookie("password", "".$password."", time()+3600);
        setcookie("username", "".$username."", time()+3600);
        header("Location:admin.php");
    }else{
        echo "Wrong Username or password combination";
    }
}else{
    echo "Must be submitted via form.";
}

Не уверен, почему код рисует эту проблему? Я использовал этот метод раньше.

Ответы [ 7 ]

10 голосов
/ 13 февраля 2009

Вы не цитируете свои строки в запросе, поэтому ваш оператор SQL недействителен.

$query  = "SELECT username,password,id FROM login WHERE username='" . mysql_escape_string($username) . "' AND password = '" . mysql_escape_string($password) . "' LIMIT 1";
$result = mysql_query($query) or die(mysql_error());

Вам нужно добавлять кавычки И использовать mysql_escape_string или mysql_real_escape_string для предотвращения атак с использованием SQL-инъекций.

2 голосов
/ 13 февраля 2009

Во-первых, проверьте на ошибки ...

«Предоставленный аргумент не является допустимым ресурсом результатов MySQL», поскольку в вашем SQL-файле произошла ошибка, но вы не упростили себе жизнь, игнорируя неудачный запрос. Используйте mysql_error , чтобы получить сообщение об ошибке.

Во-вторых, правильно экранировать строки в SQL ...

Как только вы увидите ошибку, вы увидите, что вы пропустили некоторые кавычки в вашем запросе, но вы также должны экранировать строки, введенные в запрос, иначе вы уязвимы для атак SQL-инъекцией ...

$query  = "SELECT username,password,id FROM login ".
    "WHERE username='".mysql_real_escape_string($username)."' ".
    "AND password='".mysql_real_escape_string($password)."' LIMIT 1";

$result = mysql_query($query);
if ($result)
{

    $count  = mysql_num_rows($result);

    // if 1 then login them in set cookie and redirect
    if($count==1){
        setcookie("password", "".$password."", time()+3600);
        setcookie("username", "".$username."", time()+3600);
        header("Location:admin.php");
    }else{
        echo "Wrong Username or password combination";
    }
}
else
{
    echo "Error:".mysql_error()."<br>;
}

Всегда используйте mysql_real_escape_string при построении запроса или используйте библиотеку классов-оболочек, которая делает это для вас с параметризованными запросами, например PDO или ADODb

Наконец, слово об этих печеньках ...

Кроме того, вход в систему с помощью файла cookie с именем пользователя и паролем - не очень хороший способ для входа в систему. Помимо передачи пароля в открытом виде при каждом запросе, он очень уязвим для попытки кражи cookie. Учитывая ваш наивный подход к безопасности SQL, вы, вероятно, также оставите себя уязвимым для XSS атак, упрощая кому-то сбор этих куки:)

1 голос
/ 13 февраля 2009

Похоже, вы захотите сделать 2 вещи:

  1. Очистите введенные данные - передача данных, отправленных пользователем, прямо в запрос к базе данных - это путь к катастрофе (см. mysql_real_escape_string(string $unescaped_string)).
  2. Поместить кавычки вокруг литералов в запросах к базе данных (т.е. username ='".$username."')

Полученное сообщение об ошибке связано с тем, что объект результата MySQL ($result) недопустим. Попробуйте позвонить mysql_error(), чтобы узнать, какое сообщение об ошибке возвращает MySQL.

0 голосов
/ 13 февраля 2009

Никогда не храните данные аутентификации пользователя в cookie-файле!

0 голосов
/ 13 февраля 2009

Поскольку password и login являются строками, необходимо изменить SQL:

$query="SELECT username,password,id FROM login WHERE username='".$username."' AND password='".$password."' LIMIT 1"
0 голосов
/ 13 февраля 2009

Попробуйте:

  $row = mysql_fetch_row($result);
  if ($row) { // success

Предполагая, что вы, вероятно, захотите получить некоторые столбцы вместе с проверкой подлинности (например, настоящее имя, последний вход в систему и т. Д.)

0 голосов
/ 13 февраля 2009

Запрос недействителен ($ result == false)

Line:

$query  = "SELECT username,password,id FROM login WHERE username=".$username." AND password=".$password." LIMIT 1";

Следует заменить на:

$query  = "SELECT username,password,id FROM login WHERE username='".mysql_escape_string($username)."' AND password='".mysql_escape_string$password)."' LIMIT 1";

Функция PHP mysql_query () по умолчанию не выдает ошибок. Использование функции, которая показывает ошибки sql, позволяет легко обнаружить эти ошибки.

function my_query($sql) {
  $result = mysql_query($sql);
  if ($result === false) {
    trigger_error('['.mysql_errno().'] '.mysql_error(), E_USER_WARNING);
  }
  return $result;
}

В данный момент имя пользователя и пароль вводятся непосредственно в строку sql.
То, что вы хотите, это password = "secret", теперь запрос содержит password = secret
Mysql ошибка "неизвестный столбец sercet"

PS: Использование «LIMIT 1» означает, что несколько пользователей (идентификаторов) используют одну и ту же комбинацию имени пользователя и пароля. (Не рекомендуется)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...