Написал страничку регистрации. Так как не богат опытом выслушаю любые замечания и передложения Код (PHP): <?php ini_set('display_errors',1); error_reporting(E_ALL); define ( 'fatalerror', true ); include_once ('../config.php'); //Заносим полученные данные о логине в переменную if (isset($_POST['g-recaptcha-response'])) { $grecaptcha = $_POST['g-recaptcha-response']; if ($grecaptcha == '') { unset($grecaptcha);} } //заносим введенный пользователем логин в переменную $login, если он пустой, то уничтожаем переменную if($_SERVER["REQUEST_METHOD"] == "POST") { if(!empty($grecaptcha)) { $ip = $_SERVER['REMOTE_ADDR']; $homepage = file_get_contents('https://www.google.com/recaptcha/api/siteverify?secret=ключ&response='.$grecaptcha.'&remoteip='.$ip.''); $res = json_decode($homepage, true); //reCaptcha введена if($res['success']) { //Проверели капчу она введена по этому начинаем обрабатывать данные дальше if (isset($_POST['login'])) { $login = $_POST['login']; if ($login == '') { unset($login);} } //заносим введенный пользователем логин в переменную $login, если он пустой, то уничтожаем $login = mysql_escape_string(stripslashes(htmlspecialchars($login))); if (isset($_POST['password'])) { $password=$_POST['password']; if ($password =='') { unset($password);} } $password = mysql_escape_string(stripslashes(htmlspecialchars($password))); if (isset($_POST['email'])) { $email = $_POST['email']; if ($email == '') { unset($email);} } //заносим введенный пользователем e-mail, если он пустой, то уничтожаем переменную //если пользователь не ввел логин или пароль, то выдаем ошибку и останавливаем скрипт if (empty($login) or empty($password)or empty($email)) { exit ("Вы ввели не всю информацию, вернитесь назад и заполните все поля!"); //останавливаем выполнение сценариев } //проверка е-mail адреса регулярными выражениями на корректность if (!preg_match("/[0-9a-z_]+@[0-9a-z_^\.]+\.[a-z]{2,3}/i", $email)) { exit ("Неверно введен е-mail!");} //добавляем проверку на длину логина и пароля if (strlen($login) < 3 or strlen($login) > 15) { exit ("Логин должен состоять не менее чем из 3 символов и не более чем из 15."); //останавливаем выполнение сценариев } if (strlen($password) < 3 or strlen($password) > 15) { exit ("Пароль должен состоять не менее чем из 3 символов и не более чем из 15."); //останавливаем выполнение сценариев } $password = md5($password);//шифруем пароль $password = strrev($password);// для надежности добавим реверс // проверка на существование пользователя с таким же E-mail $result = mysql_query("SELECT id FROM ru_user WHERE email='$email'",$db); $myrow_email = mysql_fetch_array($result); if (!empty($myrow_email['id'])) { exit ("Извините, введённый вами Email уже зарегистрирован. Введите другой адрес."); //останавливаем выполнение сценариев } // проверка на существование пользователя с таким же логином $result = mysql_query("SELECT id FROM ru_user WHERE login='$login'",$db); $myrow = mysql_fetch_array($result); if (!empty($myrow['id'])) { exit ("Извините, введённый вами логин уже зарегистрирован. Введите другой логин."); //останавливаем выполнение сценариев } // если такого нет, то сохраняем данные $result2 = mysql_query ("INSERT INTO `ru_user`(`email`, `login`, `password`) VALUES ('$email','$login','$password')",$db); if ($result2=='TRUE') { $result3 = mysql_query ("SELECT id FROM ru_user WHERE login='$login'",$db);//извлекаем идентификатор пользователя. Благодаря ему у нас и будет уникальный код активации, ведь двух одинаковых идентификаторов быть не может. $myrow3 = mysql_fetch_array($result3); $activation = md5($myrow3['id']).md5($login);//код активации аккаунта. Зашифруем через функцию md5 идентификатор и логин. Такое сочетание пользователь вряд ли сможет подобрать вручную через адресную строку. $subject = "Подтверждение регистрации";//тема сообщения $message = "Здравствуйте! Спасибо за регистрацию на citename.ru\nВаш логин: ".$login."\n Перейдите по ссылке, чтобы активировать ваш аккаунт:\nhttp://localhost/test3/activation.php?login=".$login."&code=".$activation."\nС уважением,\n Администрация citename.ru";//содержание сообщение mail($email, $subject, $message, "Content-type:text/plane; Charset=utf-8\r\n");//отправляем сообщение echo "Вам на E-mail выслано письмо с cсылкой, для подтверждения регистрации. Внимание! Ссылка действительна 1 час. <a href='index.php'>Главная страница</a>"; //говорим о отправленном письме пользователю } else { echo 'Зарегистрироваться не получилось';} } else { echo 'Нет капчи'; } } else { echo 'Вы не ввели капчу'; } } else { echo 'Это не пост'; } ?> Если у кого то появились мысли что это всё фуфо то я ж учусь только километровые страницы кода мне пока не подвластны.
-зачем ограничивать так сильно размер пароля? может я хочу 20 символов. что плохого в этом? -реверс хеша пароля - не добавляет никакой надежности. -mysql_ расширение устарело. нельзя им пользоваться. - код лапша. учись разбивать на блоки. выделять в функции. повторное использование кода увеличивай. - форматирование кода ужастно. точнее его нет....
Код (Text): $login = mysql_escape_string(stripslashes(htmlspecialchars($login))); тебе ведь уже говорили, что это чушь. ты или вообще не спрашивай чужое мнение или прислушивайся и анализируй. чтобы копировать поповщину много ума не надо, это не достижение.
Код (Text): $login = mysql_escape_string(stripslashes(htmlspecialchars($login))); Это я оставил так как не понял минусов а дополнительная проверка лишней не будет
Ну...теоретически...если будут не брутить, а по радуге раскатывать...стырив базу, но не получив доступ к коду и тайнам "шифрования"...в общем, где-то 0.00000000001% есть, что надежности прибавит, да. классика же) Добавлено спустя 1 минуту 22 секунды: Это ты оставил, так как не понял, что оно делает. Руководствуясь твоей логикой, можно вот так еще написать: $login = mysql_escape_string(stripslashes(htmlspecialchars(mysql_escape_string(stripslashes(htmlspecialchars($login)))))); ну...на всякий, дополнительная проверка не лишняя.
так ты пойми минусы этого решения. даже не минусы - а бредовость. пока не разберешься с этим, дальше даже нет смысла с тобой общаться. ибо если не можешь разобраться в таких простых трех функциях, то дальше уж точно не поймешь. непонимая основы - дальше двигаться несможешь.
устарело, artoodetoo может обойти и даже mysql_real_escape_string в некоторых случаях =) чувак, ну ты сначала думай, потом делай. =)
Ответь ка дружок всего на 1 вопрос, тебя не смущает этот "таран" в виде вложения Код (Text): if() { if() { if() { // и т.д. } } }
Минус в том, что там никакой проверки нет. Ты сначала спецсимволы преобразуешь в хтмл-сущности (это нужно при выводе на страничку, чтобы не вставили, например, js-код), потом удаляешь экранирующие слеши (откуда им взяться, если не было addslashes?), потом экранируешь строку перед вставкой в запрос. О какой проверке ты говоришь? Добавлено спустя 1 минуту 3 секунды: Ты просто покоцал исходные данные и все...
Забыли про пробелы $login = mysql_escape_string(stripslashes(htmlspecialchars(mysql_escape_string(stripslashes(htmlspecialchars(trim($login))))))); и strip_tags()! $login = mysql_escape_string(stripslashes(htmlspecialchars(mysql_escape_string(stripslashes(htmlspecialchars(strip_tags(trim($login)))))))); Проверка дополнительная то не лишняя будет. Только мы не проверяем, но не важно... . Если серьёзно, то если нужен ограниченный набор символов в логине, то в методе должна быть простая проверка по регулярке и больше ничего не нужно делать.
с точки зрения надёжности надёжен ли данный код если оценивать от 0 до 100 Добавлено спустя 19 секунд: Что я упустил и чего недописал
да ты толком ничего не написал. свалил всё в кучу и считаешь что готово. то что есть лишнее - ты не понимаешь. то что не хватает нужного - ты не понимаешь. опыта мало.
Хорошё что не так тут в основном понаписано что не стоит использовать mysql_escape_string, htmlspecialchars, stripslashes а всё остальное просто можно обьеденить в одну тему типа: "Ты не удачник и руки у тебя крЯвые" а по существу одна вода
Ну я хз, раз не видишь, что говорят по существу, тогда хз, что тебе ответить... Добавлено спустя 1 минуту 6 секунд: Нужно понимать зачем это делать, вот и все.
ну хер знает. сюда еще можно добавить изменение изображения, упаковку в архив, соединение по сокету. от этого ты не станешь правильно обрабатывать логин и пароль. критикуют тебя по делу. просто ты еще без опыта поэтому не понимаешь что именно ты не так сделал. ты просто накидал всё в кучу и считаешь работу выполненной. чтоб тебе жена так борщи готовила всю жизнь.
Ну ни чё я не накидывал готов ответить за каждую строчку кроме mysql_escape_string так как я знаю что она экранирует спец символы и не более того Добавлено спустя 45 секунд: Во всём остальном я могу обьяснить всю логику
Это для экранирования строки перед вставкой в запрос (это необходимо и достаточно для экранирования, не нужно "слешить" строку - это не для этого). Это для того, чтобы при вставке в документ символы не были прочтены как "спецсимволы". Например, у тебя есть комментарии на странице. Кто-то пишет такой коммент: Код (PHP): <script type="text/javascript"> alert('ololo'); </script> Как ты думаешь, что произойдет? Правильно, выскочит алерт. Чтобы этого не было, нужно спецсимволы, такие как: "<, " и т. д." Преобразовать в специальные коды ("<" станет "<", " станет """). Поэтому скрипт не сработает, а просто выведется как текст. Ну тут я вообще понятия не имею зачем нужна эта функция. Ну, то есть я понимаю что она делает, но вот где ее применить... Я не встречал такой надобности никогда.