[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Скрипт регистрации.
DeeKeiD
Собственно, что можно подправить, улучшить. Есть ли какието критичные и неочень ошибки,уязвимости в коде?

Свернутый текст

<?php
/* DeeCMS - DeeKeiD'z Content Managment System
File Version : 1.0
Files Author : DeeKeiD /
deekeid@hotmail.com

This File is protected by the intelectual property law.
You are not allowed to change anything!
*/

include ('blocks/main_left.php');

if($_POST['register'])
{
# Принимаем данные из формы
$login = isset($_POST['login'])?$_POST['login']:NULL;
$nick = isset($_POST['nickname'])?$_POST['nickname']:NULL;
$name = isset($_POST['name'])?$_POST['name']:NULL;
$password1 = isset($_POST['password1'])?$_POST['password2']:NULL;
$password2 = isset($_POST['password2'])?$_POST['password2']:NULL;
$email = isset($_POST['email'])?$_POST['email']:NULL;
$country = isset($_POST['country'])?$_POST['country']:NULL;
$sex = isset($_POST['sex'])?$_POST['sex']:NULL;
$code = isset($_POST['code'])?$_POST['code']:NULL;
$true_code = isset($_POST['true_code'])?$_POST['true_code']:NULL;
$rules = isset($_POST['rules'])?$_POST['rules']:NULL;
$userip = isset($_POST['ip'])?$_POST['ip']:NULL;
$day = isset($_POST['day'])?$_POST['day']:NULL;
$month = isset($_POST['month'])?$_POST['month']:NULL;
$year = isset($_POST['year'])?$_POST['year']:NULL;
$age = age($day,$month,$year);

/* check 1,2,3 */
$check1 = mysql_num_rows(mysql_query("SELECT * FROM `users` WHERE `ip` = '". $userip ."'"));
$check2 = mysql_num_rows(mysql_query("SELECT * FROM `users` WHERE `login` = '". mysql_real_escape_string($login) ."'"));
$check3 = mysql_num_rows(mysql_query("SELECT * FROM `users` WHERE `email` = '". $email ."'"));
/* Проверка на пустые поля */
if(empty($login)
OR empty($nick)
OR empty($name)
OR empty($password1)
OR empty($password2)
OR empty($email)
OR empty($country)
OR empty($sex)
OR empty($code))
{
error_msg('Заполните все поля');
}
/* Проверка на ввод запрещенных символов */
elseif (!preg_match("/^[-0-9A-Z_А-Яа-я@\s]+$/i", $login))
{
error_msg('invalid symbols in Login Field');
}
elseif (!preg_match("/^[-0-9A-Z_А-Яа-я@\s]+$/i", $nick))
{
error_msg('invalid symbols in Nickname Field');
}
elseif (!preg_match("/^[-0-9A-Z_А-Яа-я@\s]+$/i", $name))
{
error_msg('invalid symbols in Name Field');
}
elseif (!preg_match("/^[-0-9A-Z_\.]{1,50}@([-0-9A-Z_\.]+\.){1,50}([0-9A-Z]){2,4}$/i", $email))
{
error_msg('Please use real email address');
}
elseif(!is_numeric($code))
{
error_msg('Code must contain only numbers');
}
/* Проверка на соответсвие паролей, кода безопасности и согласия с правилами ресурса */
elseif($password1 != $password2)
{
error_msg('Passwords don\'t match');
}
elseif($code != $true_code)
{
error_msg('Security code is wrong');
}
elseif($rules != 1)
{
error_msg('You must accept rules');
}
/* Проверка на существование IP адреса, логина и email'a пользоватлея */
elseif($check1 > 0)
{
error_msg('User with same IP address is already registered');
}
elseif($check2 > 0)
{
error_msg('User with that login already exists');
}
elseif($check3 > 0)
{
error_msg('Email already exists!');
}
/* Проверка на возраст */
elseif($age < 16)
{
error_msg('Ошибка: пользователи чей возраст меньше 16 не допускаются к регистрации.');
}
/* Запись в базу */
else
{
/* Фильтрация переменных и шифровка пароля */
$f_login = mysql_real_escape_string($login);
$f_nick = mysql_real_escape_string($nick);
$f_name = mysql_real_escape_string($name);
$pwd = md5($password2);
/* Формируем код активации */
$ac_1 = rand(25450,98567) + rand(986,1657);
$ac_2 = md5($ac_1);
mysql_query("INSERT INTO `users`
(login,nickname,password,email,ip,register_date,sex,country,name,activation_code)
VALUES
('"
. $f_login ."','". $f_nick ."','". $pwd ."','". $email ."','". $userip ."',NOW(),'". $sex ."','". $country ."','". $f_name ."','". $ac_2 ."')");
/* Отправляем сообщение с кодом активации пользователю */
$to = $email;
$subject = 'Account Activation Code';
$message = '
Вы успешно зарегестрировались на сайте eReality.<br>
Для активации вашего аккаунта перейдите по <a href="http://'
. $hostname .'/index.php?module=register&action=activate&code='. $ac_2 .'&userID='. base64_encode($f_login) .'">ссылке</a>.
'
;
$headers = "Content-type: text/html; charset=windows-1251 \r\n";
$headers .= "From: eReality <admin@erl.eu>\r\n";
mail($to, $subject, $message, $headers);
info_msg('Аккаунт <b>'. $f_login .'</b> успешно зарегестрирован.<br>На вашу почту отправленно сообщение с кодом активации.');
echo '<meta http-equiv="refresh" content="2;url=index.php">';
}
}

elseif($_GET['action']=="activate")
{
$userID = $_GET['userID'];
$code = $_GET['code'];
$userLogin = base64_decode($userID);
$res = mysql_query("SELECT * FROM `users` WHERE `login` = '". $userLogin ."'");
$row = mysql_fetch_assoc($res);
if(!$res)
{
error_msg('User not Found!');
}
elseif($row['confirmed'] == 1)
{
error_msg('Аккаунт уже активирован!');
}
elseif($row['activation_code'] == $code)
{
mysql_query("UPDATE `users` SET `confirmed` = '1' WHERE `login` = '". $userLogin ."'");
info_msg('Аккаунт активирован');
}
else
{
error_msg('Activation code is wrong');
}
}

else
{
$sec_code = rand(1000,9999) + rand(99,194);
echo '<form method="POST">';
echo '<table width="100%" class="blockhead1">';
echo '<tr>';
echo '<td><b>Регистрация</b></td>';
echo '</tr>';
echo '</table>';

echo '<table width="100%" class="blockbody1"></td>';
echo '<tr>';
echo '<td width="20%"> <b>Логин</b></td>';
echo '<td width="80%"><input type="text" name="login"></td>';
echo '</tr>';
echo '<tr>';
echo '<td width="20%"> <b>Никнейм</b></td>';
echo '<td width="80%"><input type="text" name="nickname"></td>';
echo '</tr>';
echo '<tr>';
echo '<td width="20%"> <b>Имя</b></td>';
echo '<td width="80%"><input type="text" name="name"></td>';
echo '</tr>';
echo '<tr>';
echo '<td width="20%"> <b>Пароль</b></td>';
echo '<td width="80%"><input type="password" name="password1"></td>';
echo '</tr>';
echo '<tr>';
echo '<td width="20%"> <b>Пароль ещё раз</b></td>';
echo '<td width="80%"><input type="password" name="password2"></td>';
echo '</tr>';
echo '<tr>';
echo '<td width="20%"> <b>E-Mail</b></td>';
echo '<td width="80%"><input type="text" name="email"></td>';
echo '</tr>';
echo '<tr>';
echo '<td width="20%"> <b>Страна</b></td>';
echo '<td width="80%">'. country_list() .'</td>';
echo '</tr>';
echo '<tr>';
echo '<td width="20%"> <b>Пол</b></td>';
echo '<td width="80%"><select name="sex"><option value="m">Мужской</option><option value="f">Женский</option></select></td>';
echo '</tr>';
echo '<tr>';
echo '<td width="20%"> <b>Дата рождения</b></td>';
echo '<td width="80%">';
/* Day */
echo '<select name="day">';
$i = 0;
while($i != 31)
{
$i++;
echo '<option value="'. $i .'">'. $i .' </option>';
}
echo '</select>';
/* Month */
echo '<select name="month">';
$i2 = 0;
while($i2 != 12)
{
$i2++;
echo '<option value="'. $i2 .'">'. $i2 .' </option>';
}
echo '</select>';
/* Year */
echo '<select name="year">';
$i3 = 1899;
while($i3 != 2011)
{
$i3++;
echo '<option value="'. $i3 .'">'. $i3 .' </option>';
}
echo '</select>';
echo '</td>';
echo '</tr>';
echo '<tr>';
echo '<td width="20%"> <b>Код</b></td>';
echo '<td width="80%"><input type="text" name="code" size="5"> <font color="green">'. $sec_code .'</font></td>';
echo '</tr>';
echo '<tr>';
echo '<td width="20%"> <b>Правила</b></td>';
echo '<td width="80%"><input type="checkbox" name="rules" value="1"> Я согласен с <a href="#">правилами</a></td>';
echo '</tr>';
echo '<tr>';
echo '<td width="20%"></td>';
echo '<td width="80%"><input type="submit" value="Регистрация" name="register"></td>';
echo '</tr>';
echo '</table>';
echo '<input type="hidden" name="ip" value="'. $_SERVER['REMOTE_ADDR'] .'">';
echo '<input type="hidden" name="true_code" value="'. $sec_code .'">';
echo '</form>';
}

include ('blocks/main_right.php');
?>




Спустя 23 минуты, 43 секунды (8.07.2011 - 16:15) Winston написал(а):
Цитата (DeeKeiD @ 8.07.2011 - 15:51)
if($_POST['register'])

Пропиши вверху страницы error_reporting(E_ALL); и будешь неприятно удивлен.
Лучше так
if(isset($_POST['register']))

Цитата (DeeKeiD @ 8.07.2011 - 15:51)
if(empty($login)
OR empty($nick)
OR empty($name)

Это лишнее, ведь выше ты уже инициализировал переменные и проверил на пустоту, достаточно так
if(!$login
|| !$nick
|| !$name // .. и т.д.

Цитата (DeeKeiD @ 8.07.2011 - 15:51)
elseif (!preg_match("/^[-0-9A-Z_А-Яа-я@\s]+$/i", $login))

С русскими символами в UTF-8 не будет работать. Можно все проверки сократить до такого
elseif (!preg_match("/^[\wа-яё@\s-]+$/iu", $login))

Цитата (DeeKeiD @ 8.07.2011 - 15:51)
mail($to, $subject, $message, $headers);

А что произойдет после нажатия F5? :)
Потому лучше защищаться от повторной записи в базу и отправления мыла, так напиши
if(mail($to, $subject, $message, $headers))
header('Location: ' . $_SERVER['PHP_SELF']);
Цитата (DeeKeiD @ 8.07.2011 - 15:51)
elseif($_GET['action']=="activate")

C этим тоже не все в порядке.
Последуй примеру выше с использованием isset

Смешение логики это плохо.
Вот это вообще бардак, зачем на каждую строку echo ?

Цитата (DeeKeiD @ 8.07.2011 - 15:51)
echo '<form method="POST">';
echo '<table width="100%" class="blockhead1">';
echo '<tr>';
echo '<td><b>Регистрация</b></td>';
echo '</tr>';
echo '</table>';

Достаточно так написать все
	echo	'<table width="100%" class="blockhead1">'
. '<tr>'
. '<td><b>Регистрация</b></td>'
. '</tr>'
. '</table>';


Цитата (DeeKeiD @ 8.07.2011 - 15:51)
while($i != 31)

Почему так? А если $i будет больше 31?
Может имеет смысл написать так?
while($i < 31)

И почему именно 31 ?

Ну это так, на мой не профессиональный взгляд :)

Спустя 16 минут, 44 секунды (8.07.2011 - 16:32) Rand написал(а):
Цитата (PHPprogramer @ 8.07.2011 - 19:15)
Достаточно так написать все
echo '<table width="100%" class="blockhead1">'
. '<tr>'
. '<td><b>Регистрация</b></td>'
. '</tr>'
. '</table>';

Достаточно даже без конкатенации. Я на эти echo на каждой строке вообще смотреть немогу. Я ещё когда php вообще не знал, находил программу по "конвертированию" html to php, и она вот таким же образом все переделывала. Что это? Старые версии интерпретатора не поддерживали перенос части строки на новую строку?

Спустя 1 минута, 22 секунды (8.07.2011 - 16:33) Winston написал(а):
Цитата (Rand @ 8.07.2011 - 16:32)
Достаточно даже без конкатенации

Ага... Чет я даже не подумал huh.gif

Спустя 2 часа, 38 минут (8.07.2011 - 19:11) Raito-kun написал(а):
а почему с одного айпи нельзя регистрировать несколько человек? у многих провайдеров вся сеть имеет 1 внешний айпи.

elseif($check1 > 0)

достаточно
elseif($check1)


половина ошибок на русском, половина на английском.

('Ошибка: пользователи чей возраст меньше 16 не допускаются к регистрации.' 

тут запятой перед "чей" и "не" не хватает.

('". $f_login ."'

можно просто
('$f_login'

и во всех остальных запросах тоже.
дальше на echo echo echo мои глаза отказались смотреть

Спустя 2 часа, 2 минуты, 50 секунд (8.07.2011 - 21:14) ИНСИ написал(а):
DeeKeiD не хочу обидеть, но я бы выкинул этот код и сделал все по другому.

Спустя 38 минут, 29 секунд (8.07.2011 - 21:52) Tod написал(а):
heredoc полезная штука

Спустя 1 минута, 54 секунды (8.07.2011 - 21:54) bulgakov написал(а):
Ну кому хередок а кому просто php включения в html код.


_____________
Бесполезно просить пощады у цезаря
Фатальная ошибка : Звонок в неопределенную функцию ©
Быстрый ответ:

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