Автор Большой Зет задал вопрос в разделе Другие языки и технологии
Помогите с авторизацией на PHP и получил лучший ответ
Ответ от ? ?ль?? ?ен???р? ? ?[гуру]
юзай куки или сессии
Ответ от A6cypg[гуру]
Ответ от Metotron[гуру]
Я заманался твой код форматировать! Ты сам-то можешь разобрать логику программы, когда код идёт сплошняком вроде if(isset($_POST['login'])){ $login = $_POST['login']; if($login == ''){ unset($login); }}? Ты что, на PHP с перла перешёл?
И запомни, здесь все отступы убираются, размещай код на pastebin.
Итак.
Во-первых, переменные $password и $login у тебя не определены, если у тебя не пришли данные через $_POST. То, что ты запустил сессию, не значит, что из неё не нужно брать данные.
Вот это
if (isset($_POST['password']))
{
$password = $_POST['password'];
if ($password == '')
unset($password);
}
замени на
if (isset($_POST['password']) && !empty($_POST['password']))
$password = $_POST['password'];
Зачем писать лишний код?
$login = stripslashes(htmlspecialchars($login));
Так тоже короче. И ещё тут будет ошибка если через $_POST ничего не пришло, ты забыл это учесть
$password = htmlspecialchars($password);
$password = stripslashes($password);
Вот это ты нафига делаешь? Зачем ты пароль в базе в открытом виде хранишь и почему вырезаешь из него часть символов? Может быть, вообще оставим в пароле только буквы a и b, и чтобы они встречались не чаще одного раза? Ты понимаеншь, что ты уменьшаешь криптостойкость пароля? Ты делаешь htmlspecialchars, ты собрался пароль в браузер отдавать что ли? Для твоих целей есть mysql_real_escape_string. Кстати, сейчас вроде mysql_* устарели, нужно пользоваться mysqli_*
Делай так:
if (isset($password)) $password = hash('sha512', $password);
else $password = '';
затем не нужно выдёргивать данные из базы и сравнивать нужное поле с паролем, делай сразу
SELECT * FROM `users` WHERE `login`='$login' AND `password` = '$password'
Ну ты как первый раз sql увидел.
И в самом начале можешь сделать if (!isset($_SESSION['id']) && isset($_POST['login'], $_POST['password'])), чтобы вся эта фигня работала только для незалогиненных пользователей, которые прислали данные на авторизацию. И везде, где надо, проверяй $_SESSION['id']
exit("Вы что то не ввели");
-то, -либо, -нибудь. Пользователи не любят, когда разработчик сайта глупее их самих.
Если у тебя это реальный файл авторизации, нужно всё поменять. Заверни всё это дело хотя бы, например, в функцию и делай не exit и echo (кстати, почему ты их чередуешь? ) , а return или даже throw new exception
Я заманался твой код форматировать! Ты сам-то можешь разобрать логику программы, когда код идёт сплошняком вроде if(isset($_POST['login'])){ $login = $_POST['login']; if($login == ''){ unset($login); }}? Ты что, на PHP с перла перешёл?
И запомни, здесь все отступы убираются, размещай код на pastebin.
Итак.
Во-первых, переменные $password и $login у тебя не определены, если у тебя не пришли данные через $_POST. То, что ты запустил сессию, не значит, что из неё не нужно брать данные.
Вот это
if (isset($_POST['password']))
{
$password = $_POST['password'];
if ($password == '')
unset($password);
}
замени на
if (isset($_POST['password']) && !empty($_POST['password']))
$password = $_POST['password'];
Зачем писать лишний код?
$login = stripslashes(htmlspecialchars($login));
Так тоже короче. И ещё тут будет ошибка если через $_POST ничего не пришло, ты забыл это учесть
$password = htmlspecialchars($password);
$password = stripslashes($password);
Вот это ты нафига делаешь? Зачем ты пароль в базе в открытом виде хранишь и почему вырезаешь из него часть символов? Может быть, вообще оставим в пароле только буквы a и b, и чтобы они встречались не чаще одного раза? Ты понимаеншь, что ты уменьшаешь криптостойкость пароля? Ты делаешь htmlspecialchars, ты собрался пароль в браузер отдавать что ли? Для твоих целей есть mysql_real_escape_string. Кстати, сейчас вроде mysql_* устарели, нужно пользоваться mysqli_*
Делай так:
if (isset($password)) $password = hash('sha512', $password);
else $password = '';
затем не нужно выдёргивать данные из базы и сравнивать нужное поле с паролем, делай сразу
SELECT * FROM `users` WHERE `login`='$login' AND `password` = '$password'
Ну ты как первый раз sql увидел.
И в самом начале можешь сделать if (!isset($_SESSION['id']) && isset($_POST['login'], $_POST['password'])), чтобы вся эта фигня работала только для незалогиненных пользователей, которые прислали данные на авторизацию. И везде, где надо, проверяй $_SESSION['id']
exit("Вы что то не ввели");
-то, -либо, -нибудь. Пользователи не любят, когда разработчик сайта глупее их самих.
Если у тебя это реальный файл авторизации, нужно всё поменять. Заверни всё это дело хотя бы, например, в функцию и делай не exit и echo (кстати, почему ты их чередуешь? ) , а return или даже throw new exception
Ответ от Колледж Медицинский[мастер]
Кароче, удали код и перепиши заново с позиции ооп, быстрее будет и глюков меньше
Кароче, удали код и перепиши заново с позиции ооп, быстрее будет и глюков меньше
Ответ от 3 ответа[гуру]
Привет! Вот подборка тем с ответами на Ваш вопрос: Помогите с авторизацией на PHP
спросили в Nomen dubium
Как сделать регистрацию на сайте?
Регистрация + авторизация на PHP & MySQL
подробнее...
Как сделать регистрацию на сайте?
Регистрация + авторизация на PHP & MySQL
подробнее...