[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Подскажите минусы в скрипте (если они есть)
pulssscool
Скрипт регистрации

<?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

А сейчас получается, что даже если регистрация прошла успешно, то форма всё равно выдается.

Спустя 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)
вообще косячный скрипт, одно это
Цитата
if ($error==TRUE)

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

Цитата
<meta charset='utf-8'><!--Обязательно до title ###xss-->

сомнительный коммент + многие браузеры вообще не пойму мета тег.

ну и по мелочам, косяк на косяке.

А какие по мелочи косяки?Подскажи

Спустя 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 написал(а):
После вот этого:
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) ?

Спустя 37 минут, 43 секунды (3.09.2012 - 12:07) Игорь_Vasinsky написал(а):
при твоём варианте ты 2 раза юзаешь mysql_real_escape_strng + 2 раза trim

при моём - ты получаешь POST - и делаешь из него хеш и всё. его можно безопасно писать в БД

Спустя 41 секунда (3.09.2012 - 12:07) Игорь_Vasinsky написал(а):
Цитата
f ($sql==TRUE) это не правильно . А так правильно: if ($sql) ?


if ($sql===TRUE) 
if($sql)
Быстрый ответ:

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