что не так с этим SQL-запросом? - PullRequest
2 голосов
/ 23 апреля 2009

Хорошо, у меня есть две переменные в PHP

$username;
$password;

, которые инициализируются данными, полученными из переменной $ _POST:)

У меня есть этот запрос SQL

$sql = "SELECT * FROM users WHERE username = '" . $username . "' AND password = '" . $password . "')";

Но это не работает и ничего мне не возвращает: (

Можете ли вы наставить меня в правильном направлении. Пожалуйста?

Ответы [ 8 ]

12 голосов
/ 23 апреля 2009

Запрос закрывается круглой скобкой без причины, он не будет работать.

7 голосов
/ 23 апреля 2009

Что с ним не так?

Все, к сожалению. В частности, он открыт для атак с использованием SQL-инъекций.

Если это дословно вырезать и вставить, то причина, по которой он на самом деле не работает, это заключительная закрывающая скобка. Предположительно, вы не проверяете ошибки, когда вызываете это?

При использовании базового API MySQL должно быть:

$sth = $db->prepare("SELECT COUNT(*) FROM users WHERE username = ? AND password = ?");
$sth->execute($username, $password);
list($count) = $sth->fetchrow();
$authorized = ($count > 0);

или аналогичный (код не проверен, E & OE и т. Д.)

4 голосов
/ 23 апреля 2009

EEEK! SQL инъекций для одного!

РЕДАКТИРОВАТЬ: Какой ваш любимый мультфильм "программист"?

2 голосов
/ 23 апреля 2009

Почему в конце вашего запроса есть бродяга)? Его там быть не должно.

Да, и я хотел бы получить SQL-инъекцию. BAD.

1 голос
/ 23 апреля 2009

В правой части запроса есть лишние скобки.

Кроме того, если вы не очистите свой код должным образом, вы будете уязвимы для внедрения SQL. Вы действительно должны использовать параметризованные запросы, но вместо этого, по крайней мере, используйте mysql_real_escape_string() на $username и $password.

Кроме того, как небольшая отладка, очень вероятно, что ваши пароли хешируются в базе данных MD5, поскольку вы никогда не должны хранить их в виде простого текста.

Попробуйте:

$username = mysql_real_escape_string($_POST["username"]);
$password = md5($_POST["password"]);

$sql = "SELECT * FROM users WHERE username = '$username' AND password = '$password'";
1 голос
/ 23 апреля 2009

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

Тем не менее, ваш запрос содержит закрывающую скобку. Это похоже на синтаксическую ошибку. Вы получаете ошибку, выполняя это?

1 голос
/ 23 апреля 2009

У вас, кажется, есть лишняя закрывающая скобка в конце строки запроса.

[Edit] - для тех кричащих SQL-атак: мы не знаем, что пользователь сделал со своими переменными, прежде чем использовать их в запросе. Как насчет пользы сомнения? ; -)

0 голосов
/ 23 апреля 2009

В дополнение ко всем другим отмеченным проблемам. Пароль в таблице «Пользователи» хранится в зашифрованном виде. Если вы не запустили Пароль через шифратор паролей MySQL, вы никогда не увидите никаких данных из этого запроса, поскольку пароли не будут совпадать.

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