Консультация № 36153
25.02.2006, 13:36
0.00 руб.
0 2 2
Здравствуйте!
При авторизации пользователя у меня возникла такая проблема:
При проверке несовпадения логина всё работает, т.е. если таклго пользователя не в БД, то выводиться $error (работает), а вот при проверке несовпадения паролей $error не появляется. Получается так, вводишь существующий логин, любой пароль (хоть правильный, хоть не правильный) и ты авторизован. Вроде всё проверил: передача post выполняется верно, пароль из mysql выводиться верно, но при сравнении не работает.

Приложение:
<?php/*.......*/if ($authorize){ $error = ""; if ($_POST[‘login‘] == "" ) $error .= "Не указан <b>Логин</b>
"; if ($_POST[‘password‘] == "" ) $error .= "Не указан <b>Пароль</b>
"; $db = @mysql_connect($conf[‘mysql_host‘],$conf[‘mysql_user‘],$conf[‘mysql_pass‘]) or die ("<font color=‘red‘>Ошибка: Неудалось подключиться к БД</font>"); @mysql_select_db($conf[‘mysql_db‘]) or die ("<font color=‘red‘>Ошибка: Неудалось выбрать БД</font>"); if ( (isset($_POST[‘login‘])) && (isset($_POST[‘password‘])) ) { $sql_searchUser = "SELECT * FROM `cms_users` WHERE ( `us_name` = ‘".$_POST[‘login‘]."‘ )"; $result_searchUser = mysql_query($sql_searchUser); $_searchUser = mysql_fetch_array($result_searchUser, MYSQL_ASSOC); echo "( (".$_POST[‘login‘]." != ".$_searchUser[‘us_name‘].") && (".$_POST[‘password‘]." != ".$_searchUser[‘us_password‘].") )
"; #Проверка if ( $_POST[‘login‘] != $_searchUser[‘us_name‘] && $_POST[‘password‘] != $_searchUser[‘us_password‘] ) { $error .= "Логин или пароль указан не правильно
"; } /* Проверка echo "|\$_POST|<pre>"; print_r ($_POST); echo "</pre>"; echo "|\$_searchUser|<pre>"; print_r ($_searchUser); echo "</pre>"; */ mysql_free_result($result_searchUser); } if ($error != "") { echo "<center><font color=‘red‘>$error</font></center>"; } else { echo "<center><font color=‘green‘>Вы успешно авторизованы</font></center>
"; /* Внесение данных в БД и сессии */ mysql_close(); }}?>

Обсуждение

Неизвестный
25.02.2006, 15:03
общий
это ответ
Здравствуйте, Fem!
Во-первых надо изменить sql-запрос (см. приложение).
Во-вторых необходимо подставлять не "сырые" POST-данные, а проверить, MAGIC_QUOTES, и если эта опция выключена, то закрыть кавычки в строке при помощи addslashes().
В-третьих, необходимо проверить, какое количество строк вернула выборка. Должно вернуть одну строку.

Приложение:
"SELECT * FROM `cms_users` WHERE (`us_name`LIKE ‘" . $_POST[‘login‘] . "‘ AND `us_pass` LIKE ‘" . $_POST[‘password‘] . "‘)"
Неизвестный
25.02.2006, 15:07
общий
это ответ
Здравствуйте, Fem!

Ошибка в проверке условия:

if ( $_POST[‘login‘] != $_searchUser[‘us_name‘] && $_POST[‘password‘] != $_searchUser[‘us_password‘] )
{$error .= "Логин или пароль указан не правильно
";}

Оно срабатывает, только когда оба условия выполняются одновременно. Нужно изменить условие (поставить логическое "или" вместо "и") вот так:

if ( ($_POST[‘login‘] != $_searchUser[‘us_name‘]) || ($_POST[‘password‘] != $_searchUser[‘us_password‘]) )
{$error .= "Логин или пароль указан не правильно
"; }

А вообще-то проверку лучше делать при выборе из базы:
$sql_searchUser = "SELECT * FROM `cms_users` WHERE `us_name` = ‘".$_POST[‘login‘]."‘ AND `us_password`=".$_POST[‘password‘];

Естественно, если пароль захеширован, то и проверять нужно хеш.
И если не одной записи не найдено, то логин или пароль не правильный.
Форма ответа