<?php
session_start();
include_once ('inc/bd.php');
?>
<!DOCTYPE html>
<html>
<head>
<meta charset='utf-8'><!--Обязательно до title ###xss-->
<title>Reg.php</title>
</head>
<body>
<h1>Registration</h1>
<?php
if (!empty($_POST['submit'])=='login')
{
$login = trim(mysql_real_escape_string($_POST['login']));
$password = trim(mysql_real_escape_string($_POST['password']));
$rpassword = trim(mysql_real_escape_string($_POST['rpassword']));
$mail = trim(mysql_real_escape_string($_POST['mail']));
$captcha = trim(mysql_real_escape_string($_POST['captcha']));
$error = FALSE;//Создаем переменную, контролирующую ошибки регистрации.
$errortext = '<ul class="error">При регистрации на сайте произошли следующие ошибки:';
if (empty($login))
{
$error = TRUE;
$errortext .= '<li>Вы не заполнели поле Login!</li>';
}
else
{
$result = mysql_query("SELECT `id` FROM `users` WHERE `login`='$login' LIMIT 1") or die (mysql_error());
$myrow = mysql_fetch_array($result);
if (!empty($myrow['id']))
{
$error = TRUE;
$errortext .='<li>Извините, введённый вами логин уже зарегистрирован. Введите другой логин</li>';
unset ($_POST['login']);
}
if (!preg_match('/^[a-z0-9]{3,15}$/i',$login))
{
$error = TRUE;
$errortext .= '<li>Убедитесь что Логин содержит от 3 до 15 символов, и состоит из латинских символов и цифр</li>';
unset ($_POST['login']);
}
}
if (empty($password))
{
$error = TRUE;
$errortext .= '<li>Вы не заполнили поле Пароль!</li>';
}
else
{
if (!preg_match('/^[a-z0-9]{5,15}$/i',$password))
{
$error = TRUE;
$errortext .= '<li>Убедитесь что Пароль содержит от 5 до 15 символов, и состоит из латинских символов и цифр</li>';
unset ($_POST['password']);
}
}
if (empty($rpassword))
{
$error = TRUE;
$errortext .= '<li>Вы не заполнили поле Подтверждение пароля!</li>';
}
else
{
if ($password != $rpassword)
{
$error = TRUE;
$errortext .= '<li>Поле Пароль и его Подтверждение не совпадают!</li>';
unset ($_POST['rpassword']);
unset ($_POST['password']);
}
}
if (empty($mail))
{
$error = TRUE;
$errortext .= '<li>Вы не заполнили поле mail!</li>';
}
else
{
$resul = mysql_query("SELECT `id` FROM `users` WHERE `mail`='$mail' LIMIT 1");
$myr = mysql_fetch_array($resul);
if (!empty($myr['id']))
{
$error = TRUE;
$errortext .='<li>Извините, введённый вами mail уже зарегистрирован. Введите другой mail</li>';
unset ($_POST['mail']);
}
if (!preg_match ("|^[-0-9a-z_\.]+@[-0-9a-z_^\.]+\.[a-z]{2,6}$|i",$mail))
{
$error = TRUE;
$errortext .= '<li>Убедитесь что mail указан правильно!</li>';
unset ($_POST['mail']);
}
}
if (empty($captcha))
{
$error = TRUE;
$errortext .= '<li>Вы не заполнили поле captcha!</li>';
}
else
{
if ($_SESSION['captcha'] != $captcha)
{
$error = TRUE;
$errortext .= '<li>Captcha не совпадает!</li>';
unset ($_POST['captcha']);
}
}
$errortext .= '</ul>';//Закрываем список ul
if ($error==TRUE)
{//Выводим текст ошибок.
echo($errortext);
unset($_POST['submit']);
}
else
{
$password=md5($password)."de12!";
$avatar="avatars/net-avatara.png";//присваиваем стандартный аватар
$sql = mysql_query ("INSERT INTO `users` (`login`,`pass`,`mail`,`reg_date`,`avatar`) VALUES('$login','$password','$mail',NOW(),'$avatar')") or die (mysql_error());
if ($sql==TRUE)
{//Выводим сообщение об успешной регистрации
echo '<p>Вы успешно зарегистрированы на сайте!</p>';
}
unset ($_POST);
mysql_close($link);
}
}
?>
<form method='POST' action='reg.php' name='reg'>
<table frame='border' cols='2' rules='none' cellpadding='3'>
<tr>
<td>Login</td>
<td><input name='login' autocomplete='on' type='text' maxlength='15' size='18' <?php if (!empty($_POST['login'])) { echo "value='".$_POST['login']."'"; }?>></td>
</tr>
<tr>
<td>Password</td>
<td><input name='password' autocomplete='off' type='password' maxlength='15' size='18'></td>
</tr>
<tr>
<td>rPassword</td>
<td><input name='rpassword' autocomplete='off' type='password' maxlength='15' size='18'></td>
</tr>
<tr>
<td>email</td>
<td><input name='mail' autocomplete='on' type='text' maxlength='40' size='18' <?php if (!empty($_POST['mail'])) { echo "value='".$_POST['mail']."'"; }?>></td>
</tr>
<tr>
<td><img src='captcha.php' id='capcha-image'></td>
<td><input name='captcha' autocomplete='off' type='text' maxlength='4' size='4'></td>
</tr>
<tr>
<td><input name='submit' type='submit' value='login'></td>
<td><a href="javascript:void(0);" onclick="document.getElementById('capcha-image').src='captcha.php?rid=' + Math.random();">Обновить</a></td>
</tr>
</table>
</form>
</body>
</html>
Спустя 7 минут, 11 секунд (2.09.2012 - 23:31) kamanch написал(а):
Всю обработку данных выносишь в самое начало. ДО <!DOCTYPE html>
Все сообщения, которые у тебя там есть, заносишь в переменные, как ты сделал в $errortext.
После этого, если $errortext пустой, то просто выводишь переменную (массив), в которой сообщение об успешной регистрации, иначе выводишь свой $errortext
А сейчас получается, что даже если регистрация прошла успешно, то форма всё равно выдается.
Все сообщения, которые у тебя там есть, заносишь в переменные, как ты сделал в $errortext.
После этого, если $errortext пустой, то просто выводишь переменную (массив), в которой сообщение об успешной регистрации, иначе выводишь свой $errortext
А сейчас получается, что даже если регистрация прошла успешно, то форма всё равно выдается.
Спустя 7 часов, 10 минут, 49 секунд (3.09.2012 - 06:42) pulssscool написал(а):
{//Выводим сообщение об успешной регистрации
echo '<p>Вы успешно зарегистрированы на сайте!</p></body></html>';
exit();
}
Так может так лучше прописать?
Спустя 2 минуты, 11 секунд (3.09.2012 - 06:44) pulssscool написал(а):
И еще $_POST обязательно нужно уничтожать? Просто кто говорит что да, кто то нет?
Спустя 2 минуты, 17 секунд (3.09.2012 - 06:46) pulssscool написал(а):
Меня еще интересует этот кусок кода в конце скрипта, а именно if ($sql==TRUE), нужно ли до нее писать $sql==FALSE ?
{
$password=md5($password)."de12!";
$avatar="avatars/net-avatara.png";//присваиваем стандартный аватар
$sql = mysql_query ("INSERT INTO `users` (`login`,`pass`,`mail`,`reg_date`,`avatar`) VALUES('$login','$password','$mail',NOW(),'$avatar')") or die (mysql_error());
if ($sql==TRUE)
{//Выводим сообщение об успешной регистрации
echo '<p>Вы успешно зарегистрированы на сайте!</p>';
}
unset ($_POST);
mysql_close($link);
}
Спустя 7 минут, 15 секунд (3.09.2012 - 06:54) Игорь_Vasinsky написал(а):
вообще косячный скрипт, одно это
Цитата |
if ($error==TRUE) |
способствует разрушению заложенной логики, делая скрипт не предсказуемым.
Цитата |
<meta charset='utf-8'><!--Обязательно до title ###xss--> |
сомнительный коммент + многие браузеры вообще не пойму мета тег.
ну и по мелочам, косяк на косяке.
Спустя 48 секунд (3.09.2012 - 06:54) kamanch написал(а):
Цитата |
Так может так лучше прописать? |
Запоминай:
Логика отдельно, отображение отдельно.
Через 3 месяца захочешь внести изменение в дизайн, и начнешь подпрыгивать, как бы что не разрушить в логике, и ведь разрушишь.
Или понадобится внести пару условий в логику, а дизайн там под ногами путается и совсем в итоге не на тех местах оказался, как задумывалось.
Пусть даже у тебя 1 файл, даже в нем делишь логику от вывода.
А exit(); вообще нужно использовать только если ты хочешь, чтобы скрипт упал. например, если обнаружена попытка взлома.
У тебя после exit(); как минимум еще идут </body> и </html>, но они уже не выведутся в браузер, а это уже "садись, двойка"
$_POST уничтожать не надо, пусть живет, он никому не мешает.
Тем более, что уничтожишь ты его в скрипте, а в браузере в форме он останется.
Для защиты от обновления страницы и повторной отправки данных из формы используется редирект. В твоем случае, страницы самой на себя.
Спустя 3 минуты, 24 секунды (3.09.2012 - 06:58) Игорь_Vasinsky написал(а):
Цитата |
$error = FALSE;//Создаем переменную, контролирующую ошибки регистрации. |
зачем тратить ресурсы создавая флаг, если можно вообще проверять его наличие? т.е. если нет переменной (или массива) - то значит и ошибок нет.
Спустя 3 часа, 27 минут, 48 секунд (3.09.2012 - 10:26) pulssscool написал(а):
Цитата (Игорь_Vasinsky @ 3.09.2012 - 07:54) | ||||
вообще косячный скрипт, одно это
способствует разрушению заложенной логики, делая скрипт не предсказуемым.
сомнительный коммент + многие браузеры вообще не пойму мета тег. ну и по мелочам, косяк на косяке. |
А какие по мелочи косяки?Подскажи
Спустя 6 минут, 30 секунд (3.09.2012 - 10:32) Игорь_Vasinsky написал(а):
Цитата |
$password = trim(mysql_real_escape_string($_POST['password'])); |
не логичней брать хеш???
Цитата |
unset ($_POST['login']); |
смысл?
Цитата |
if ($sql==TRUE) |
разве так с булеан сравнивают?
Цитата |
$myr = mysql_fetch_array($resul); |
тебе оба массива нужны? может mysql_fetch_assoc - логичней использовать?
Цитата |
$result = mysql_query("SELECT `id` FROM `users` WHERE `login`='$login' LIMIT 1") or die (mysql_error()); $myrow = mysql_fetch_array($result); if (!empty($myrow['id'])) { |
хитрая конструкция)
про mysql_num_rows() прочитай
ну и вообщем читабельность хромает из-за такого щедрого использования условий.
Спустя 25 минут, 17 секунд (3.09.2012 - 10:57) Michael написал(а):
После вот этого:
уже не стал смотреть, т.к. по этому фрагменту видно что php ты слабо понимаешь.
Смотрим мануал, функция empty возвращает булевое значение. Отрицание булевого - тоже булевое. Смысла булевое проверять на равенство со строкой с определенным содержимым нет. Хотя у тебя оно приведется к типу и пропустит, но все равно косяк.
if (!empty($_POST['submit'])=='login')
уже не стал смотреть, т.к. по этому фрагменту видно что php ты слабо понимаешь.
Смотрим мануал, функция empty возвращает булевое значение. Отрицание булевого - тоже булевое. Смысла булевое проверять на равенство со строкой с определенным содержимым нет. Хотя у тебя оно приведется к типу и пропустит, но все равно косяк.
Спустя 4 минуты, 45 секунд (3.09.2012 - 11:02) Игорь_Vasinsky написал(а):
isset() юзай чтоб нащупать кнопу
Спустя 26 минут, 44 секунды (3.09.2012 - 11:29) pulssscool написал(а):
Спасибо )
Относительно хэша для пароля как писал Игорь, разве не легче сравнит пароль и подтверждение пароля не в md5. А потом если они совпадают, то и сделать хэш пароля. Разве так не быстрее работать будет?
if ($sql==TRUE) это не правильно . А так правильно: if ($sql) ?
Относительно хэша для пароля как писал Игорь, разве не легче сравнит пароль и подтверждение пароля не в md5. А потом если они совпадают, то и сделать хэш пароля. Разве так не быстрее работать будет?
if ($sql==TRUE) это не правильно . А так правильно: if ($sql) ?
Спустя 37 минут, 43 секунды (3.09.2012 - 12:07) Игорь_Vasinsky написал(а):
при твоём варианте ты 2 раза юзаешь mysql_real_escape_strng + 2 раза trim
при моём - ты получаешь POST - и делаешь из него хеш и всё. его можно безопасно писать в БД
при моём - ты получаешь POST - и делаешь из него хеш и всё. его можно безопасно писать в БД
Спустя 41 секунда (3.09.2012 - 12:07) Игорь_Vasinsky написал(а):
Цитата |
f ($sql==TRUE) это не правильно . А так правильно: if ($sql) ? |
if ($sql===TRUE)
if($sql)