[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Авторизация/Регистрация/Профиль/Общение
tanaevser
Привет всем ;)
В php я не сильно соображаю, но тем не менее. Пишу свой сайт, с регистрацией, авторизацией, профилем (редактирование регистрационных данных), общением между пользователем (личные сообщения, комментарии, блоги).

Остановился на профиле. Сделал редактирование логина и пароля.
options.php

<?php
session_start();

include ("bd.php"); // подключаемся к Базе Данных

if (!empty($_SESSION['login']) and !empty($_SESSION['password']))
{
// если существует логин и пароль в сессиях, то проверяем, действительны ли они
$login = $_SESSION['login'];
$password = $_SESSION['password'];
$result2 = mysql_query("SELECT id, login, avatar, surname, name FROM users WHERE login='$login' AND password='$password'",$db);
$myrow2 = mysql_fetch_array($result2);
if (empty($myrow2['id']))
{
// если не действительны (может мы удалили этого пользователя из базы за плохое поведение)
exit("Вход на эту страницу разрешен только зарегистрированным пользователям!");
}
}

else {
// проверяем, зарегистрирован ли вошедший
exit("Вход на эту страницу разрешен только зарегистрированным пользователям!");
}

echo "<form action='update_options.php' method='post'>
<div class='title'>Изменить логин</div><br />
Текущий логин: <b>
$myrow2[login]</b><br /><br />
<span class='label'>Новый логин:</span><br />
<input name='login' type='text' size='30' maxlength='15' class='text'><input type='submit' name='submit' value='Изменить' class='submit'>
</form>
<br />
<form action='update_options.php' method='post'>
<div class='title'>Изменить пароль</div><br />
<span class='label'>Новый пароль:</span><br />
<input name='password' type='password' size='30' maxlength='15' class='text'><input type='submit' name='submit' value='Изменить' class='submit'>
</form>"
;

?>

update_options.php

<?php
session_start();
include ("bd.php"); // подключаемся к Базе данных
if (!empty($_SESSION['login']) and !empty($_SESSION['password']))
{
// если существует логин и пароль в сессиях, то проверяем, действительны ли они
$login = $_SESSION['login'];
$password = $_SESSION['password'];
$result2 = mysql_query("SELECT id FROM users WHERE login='$login' AND password='$password'",$db);
$myrow2 = mysql_fetch_array($result2);
if (empty($myrow2['id']))
{
// если не действительны, то закрываем доступ
exit("Вход на эту страницу разрешен только зарегистрированным пользователям!");
}
}

else {
// проверяем, зарегистрирован ли вошедший
exit("Вход на эту страницу разрешен только зарегистрированным пользователям!"); }
$old_login = $_SESSION['login']; // старый логин нам пригодиться
$id = $_SESSION['id']; // идентификатор пользователя тоже нужен

////////////////////////////////
////////ИЗМЕНЕНИЕ ЛОГИНА////////
////////////////////////////////

if (isset($_POST['login'])) // если существует логин
{
$login = $_POST['login'];
$login = stripslashes($login);
$login = htmlspecialchars($login);
$login = trim($login); // удаляем все лишнее
if ($login == '') { exit("Вы не ввели логин."); } // если логин пустой, то останавливаем
if (strlen($login) < 3 or strlen($login) > 15)
{
// проверяем длину
exit ("Логин должен состоять не менее чем из 3 символов и не более чем из 15."); // останавливаем выполнение сценариев
}
// проверка на существование пользователя с таким же логином
$result = mysql_query("SELECT id FROM users WHERE login='$login'",$db);
$myrow = mysql_fetch_array($result);
if (!empty($myrow['id'])) {
exit ("Извините, введённый вами логин уже зарегистрирован. Введите другой логин."); // останавливаем выполнение сценариев
}
$result4 = mysql_query("UPDATE users SET login='$login' WHERE login='$old_login'",$db); // обновляем в Базе Данных логин пользователя
if ($result4=='TRUE')
{
// если выполнено верно, то обновляем все сообщения, которые отправлены ему
mysql_query("UPDATE messages SET author='$login' WHERE author='$old_login'",$db);
$_SESSION['login'] = $login; // обновляем логин в сессии
echo "<html><head><meta http-equiv='Refresh' content='5; URL=page.php?id=".$_SESSION['id']."'></head><body>Ваш логин изменен! Вы будете перемещены через 5 сек. Если не хотите ждать, то <a href='page.php?id=".$_SESSION['id']."'>нажмите сюда.</a></body></html>"; } // отправляем пользователя назад
}

////////////////////////////////
////////ИЗМЕНЕНИЕ ПАРОЛЯ////////
////////////////////////////////

else if (isset($_POST['password'])) // если существует пароль
{
$password = $_POST['password'];
$password = stripslashes($password);
$password = htmlspecialchars($password);
$password = trim($password); // удаляем все лишнее
if ($password == '') { exit("Вы не ввели пароль.");} // если пароль не введен, то выдаем ошибку
if (strlen($password) < 3 or strlen($password) > 15) { // проверка на количество символов
exit ("Пароль должен состоять не менее чем из 3 символов и не более чем из 15."); // останавливаем выполнение сценариев
}
$password = md5($password); // шифруем пароль
$password = strrev($password); // для надежности добавим реверс
$password = $password."b3p6f";
$result4 = mysql_query("UPDATE users SET password='$password' WHERE login='$old_login'",$db); // обновляем пароль
if ($result4=='TRUE') { // если верно, то обновляем его в сессии
$_SESSION['password'] = $password;
echo "<html><head><meta http-equiv='Refresh' content='5; URL=page.php?id=".$_SESSION['id']."'></head><body>Ваш пароль изменен! Вы будете перемещены через 5 сек. Если не хотите ждать, то <a href='page.php?id=".$_SESSION['id']."'>нажмите сюда.</a></body></html>"; } // отправляем братно на его страницу
}

?>


Вопрос:
Всё работает отлично. Но нужно добавить ввод старого пароля и сравнение его с паролем, тот что в бд (или куках). Т.е. дописать в файл options.php форму одного поля, и в файл update_options.php ряд изменение в часть кода, где идет обработка пароля.

Мое решение:
В файл options.php дописываю:

<form action='update_options.php' method='post'>
<div
class='title'>Изменить пароль</div><br />
<span
class='label'>Старый пароль:</span><br />
<input
name='old_password' type='password' size='30' maxlength='15' class='text'><br />
<span
class='label'>Новый пароль:</span><br />
<input
name='password' type='password' size='30' maxlength='15' class='text'><input type='submit' name='submit' value='Изменить' class='submit'>
</form>


В файл update_options.php дописываю:

////////////////////////////////
////////ИЗМЕНЕНИЕ ПАРОЛЯ////////
////////////////////////////////

else if (isset($_POST['old_password'])) // если существует пароль
{
$old_password = $_POST['old_password'];
if ($old_password == '') { exit("Вы не ввели старый пароль.");} // если пароль не введен, то выдаем ошибку
else {
// если пароли совпадают, то запускаем сессию
$old_password1=$old_password;
if (isset($_POST['password'])) {
$password = $_POST['password'];
$password = stripslashes($password);
$password = htmlspecialchars($password);
$password = trim($password); // удаляем все лишнее

if ($password == '') { exit("Вы не ввели пароль.");} // если пароль не введен, то выдаем ошибку
if (strlen($password) < 3 or strlen($password) > 15) { // проверка на количество символов
exit ("Пароль должен состоять не менее чем из 3 символов и не более чем из 15."); // останавливаем выполнение сценариев
}
$password = md5($password); // шифруем пароль
$password = strrev($password); // для надежности добавим реверс
$password = $password."b3p6f";
$result4 = mysql_query("UPDATE users SET password='$password' WHERE login='$old_login'",$db); // обновляем пароль
if ($result4=='TRUE') { // если верно, то обновляем его в сессии
$_SESSION['password'] = $password;
echo "<html><head><meta http-equiv='Refresh' content='5; URL=page.php?id=".$_SESSION['id']."'></head><body>Ваш пароль изменен! Вы будете перемещены через 5 сек. Если не хотите ждать, то <a href='page.php?id=".$_SESSION['id']."'>нажмите сюда.</a></body></html>"; } // отправляем братно на его страницу
}}}


Но нихрена не работает :))) Подскажите, светлые головы :)) Буду очень благодарен.



Спустя 16 минут, 11 секунд (3.12.2010 - 19:42) Игорь_Vasinsky написал(а):
Во первых логин не зачем разрешать менять, он должен быть как родинка - одним единственным, иначе потеряешь контроль над ситуацией.

1. делаешь в профиле ещё input дляввода старого пароля
2. при нажатии кнопы "сохранить" - делаешь проверку введённого в этот input пароля с паролем из БД (не забывая чт он там у тебя в md5 и прикрыт реверсом)
3. если ОК - сохраняешь новые данные - если нет - снова форму и выдаёшь ошибку "Пароль ни хрена не вернен"

Совет - сделай 2й инпут для нового пароля - чтоб сравнить, вдруг юзер опечатается - а ты в БД под md5 - он не сможет войти - ты не сможешь помочь.

Спустя 3 минуты, 17 секунд (3.12.2010 - 19:45) Игорь_Vasinsky написал(а):
если переменные в строку суёшь - используй такой синтаксис

WHERE login='$old_login'",$db); 

вот такой
WHERE login='".$old_login."'",$db);


а вообще незачем стока писать кода было..пост не читбельный.

поправь листинг - в свёрнутые списки

Спустя 1 час, 10 минут, 49 секунд (3.12.2010 - 20:56) tanaevser написал(а):
Про md5 и реверс я просто забыл, а все остальное я и так знал. Мне бы это все в php коде, а не на словах rolleyes.gif

Как "родинка" у меня ID (индефикатор пользователя). А логин вместо e-mail адреса, чисто для авторизации.

P.S. У меня еще есть пару вопросов, после решения данного вопроса, задам еще один smile.gif По мере создания сайта, возможно будут еще проблемы...

Спустя 42 минуты, 42 секунды (3.12.2010 - 21:39) Игорь_Vasinsky написал(а):
ну смотри - ты проверяешь на влидность данные посланные формой из профиля (при редактирования)

if()
1.Всё валидно, пароли совпадают, старый пароль введён корректно
{}
пишем новые данные в БД

else {}

- ни чё не пишем в базу
-------------------------------------
в итоге достаточно 1 условия if

p/s/ перед тем как сверить старый введённый пароль с паролем из БД, его нужно также замутить с md5 + реверс


а кнопа сохранить в форме редактирования профиля имеет вид
допустим:
profile.php - сртаница профиля

profile.php?action=edit - читаешь $_GET['action'] и если он идентичен "edit" - то выводишь форму редактирования прфиля

тады action у формы, к примеру
profil.php?action=update
или
$_SERVER['PHP_SELF']."?action=update"

т.е. как в строке появится action=update - значит были переданы данные из формы редактирования профиля и так же не обходимо проверить введённый пароль профиля с тем что хранится в БД


вот и реализуй.

Во и напиши это простое условие

Спустя 21 минута, 46 секунд (3.12.2010 - 22:01) ИНСИ написал(а):
капец :) начни с того, чтобы делать свои скрипты и сайты безопасными. Смотри в сторону:
mysql_real_escape_string() и stipslashes()

Спустя 1 месяц, 1 день, 11 часов, 4 минуты, 24 секунды (5.01.2011 - 09:05) Зарегестрирований написал(а):
Я тут залетом но все же хочу спросить
а что если ставить mysql_real_escape_string() в запросе БД
mysql_query("SELECT * FROM aa WHERE id=mysql_real_escape_string("'.$id.'")")

Или лутче сразу ТАК:
$id == mysql_real_escape_string($_POST['id']);

PS обезательно приравнивать $id == или можна $id =

Спустя 7 часов, 21 минута, 48 секунд (5.01.2011 - 16:27) inpost написал(а):
Зарегестрирований
Лучше ко мне в подпись, там показано как =) Особенно в последней (там 5 маленьких заметок, очень важных для начинающих!)

Спустя 5 часов, 14 минут, 28 секунд (5.01.2011 - 21:41) Зарегестрирований написал(а):
такой акцент на Начинающих
да я уже вроде методом тыка допнул планку
во
$login = mysql_escape_string($login);

Спустя 22 минуты, 54 секунды (5.01.2011 - 22:04) ИНСИ написал(а):
Зарегестрирований обрати внимание на real .... mysql_real_escape_string и stripslashes

Цитата
а что если ставить mysql_real_escape_string() в запросе БД

Есть программисты, которые в самом запросе делают защиту, а есть которые заносят в переменные. Тут, кому как удобно ... Главное чтобы было защищено smile.gif

Цитата
PS обезательно приравнивать $id == или можна $id =

тут тоже на любителя

Спустя 44 минуты, 27 секунд (5.01.2011 - 22:49) PiratXXX написал(а):
елы палы "руб за сто даю", попов учил??

вот тупой у меня вопрос а нафига сессию сравнивать с бд???

ведь можно мануал почить и там за сессию, написано что ее почти не возможно потделать!!!!

а если ты проверяешь то что почти не возможно потделать, то обработывай данные которые получаешь!!!

короче по этому поводу могу дать тебе свой скрипт измены инфы...
тока при условии что будешь учить функции...

Спустя 9 минут, 30 секунд (5.01.2011 - 22:58) inpost написал(а):
PiratXXX
1. У сессии есть идентификатор, и есть вероятность, что пользователь получит идентификатор существующей сессии (которая просто не успела закрыться, вот тут и происходит бардак.

welbox2
Каждая переменная и есть ячейка памяти, если желаешь экономить, то сразу в БД mysql_real_escape_string($_POST['text']).

Спустя 14 минут, 4 секунды (5.01.2011 - 23:12) Игорь_Vasinsky написал(а):
Цитата
Каждая переменная и есть ячейка памяти, если желаешь экономить, то сразу в БД mysql_real_escape_string($_POST['text']).


А ЕСЛИ ПЕРЕМЕННАЯ МНОГОКРАТНО ИСПОЛЬЗУЕТСЯ...

не... лучще сделать сразу безопасную переменную [quote]чем каждый раз безопасить переданные данные..

хотя .... дело вкуса и привычки каждого...

Спустя 7 минут, 38 секунд (5.01.2011 - 23:20) Игорь_Vasinsky написал(а):
Цитата
PS обезательно приравнивать $id == или можна $id =



= - здесь не приравнени, а присвоение...

Спустя 9 минут, 16 секунд (5.01.2011 - 23:29) inpost написал(а):
Игорь_Vasinsky
Так я про это и говорю, если единажды используется переменная, то сразу в БД, если несколько раз - тогда лучше как ты говоришь =)

Спустя 1 час, 21 минута, 21 секунда (6.01.2011 - 00:50) ИНСИ написал(а):
не буду цитировать всех .. просто повторюсь.....

Цитата
Есть программисты, которые в самом запросе делают защиту, а есть которые заносят в переменные. Тут, кому как удобно ... Главное чтобы было защищено


Спустя 9 часов, 41 минута, 11 секунд (6.01.2011 - 10:32) Зарегестрирований написал(а):
PiratXXX
ты на кого бочку котишь если на меня то там не сесия
-=-=-==-=-=-=-=-=
а вообше по сути у меня не работает mysql_real_escape_string() Хз
Наверно что-то с версией ПХП
я вроде брал Апачик с 5.3 а у меня дивным образом показует папку php6
кстате как подробно узнать какая версия ПХП?

Спустя 2 часа, 8 минут, 17 секунд (6.01.2011 - 12:40) inpost написал(а):
Зарегестрирований
Что значит не работает? В PHPMYADMIN заносятся данные со слешами?

Спустя 1 час, 1 минута, 30 секунд (6.01.2011 - 13:41) Зарегестрирований написал(а):
нет без /
просто выдает "Соединение с сервером закрыто"
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.