За последние 24 часа нас посетили 218512 программистов и 2187 роботов. Сейчас ищут 2080 программистов ...

на суд

Тема в разделе "PHP для новичков", создана пользователем bookin, 1 фев 2010.

  1. bookin

    bookin Активный пользователь

    С нами с:
    11 ноя 2009
    Сообщения:
    120
    Симпатии:
    0
    приведу ниже код, хотел бы услышать всю критику, и советы, может , даже не может а я уверен что стоит что то дет поменять, для улучшения(т.к. я навичек в PHP фразы типа ты ламер, л..х, баран и т.д. я и без вас знаю =)) )

    PHP:
    1. <?php
    2.  
    3.  ?>
    4. <html>
    5. <head>
    6. <!--подключение стилей-->
    7.     <link rel="stylesheet" type="text/css" href="css/reg.css">
    8.  
    9. <link rel="stylesheet" href="css/validationEngine.jquery.css" type="text/css" media="screen" title="no title" charset="utf-8" />
    10.  
    11.         <script src="js/jquery.js" type="text/javascript"></script>
    12.  
    13. <script src="js/jquery.validationEngine.js" type="text/javascript"></script>
    14. <!--/подключение стилей-->
    15. <div id="main">
    16. <!--Вывод форм для ввода данных-->
    17. <div id="form">
    18. <form method="post" action="" class="formular">
    19. <div id="forms">
    20.     <p class="class1">Login<sup class="sup"><small>*</small></sup>:</p>
    21.     <input type="text" name="login" size="20" maxlength="100" class="validate[required,custom[onlyLetter],length[0,100]] text-input" id="login" value="<?=isset($_POST['login']) ? $_POST['login'] : '' ?>"><br>
    22.     <p class="class2">E-mail<sup class="sup"><small>*</small></sup>:</p>
    23.     <input type="text" name="email" size="20" maxlength="100" class="validate[required,custom[email]]" id="email" value="<?=isset($_POST['email']) ? $_POST['email'] : '' ?>"><br>
    24.     <p class="class3">Пароль<sup class="sup"><small>*</small></sup>:</p>
    25.     <input type="password" name="password" size="20" maxlength="30" class="validate[required,length[3,16],custom[onlyLetter]]" id="pass" value="<?=isset($_POST['password']) ? $_POST['password'] : '' ?>"><br>
    26.     <p class="class4">Повторить пароль<sup class="sup"><small>*</small></sup>:</p>
    27.     <input type="password" name="password2" size="20" maxlength="30" class="validate[required,ength[3,16],confirm[pass]]" id="pass2" value="<?=isset($_POST['password2']) ? $_POST['password2'] : '' ?>"><br>
    28.     <p class="class5">Введите символы с картинки<sup class="sup"><small>*</small></sup>:</p><br>
    29.         <!-- картинка защитного кода -->
    30.  
    31.         <div id=cap4a>
    32.         <img src="secpic/secpic.php" alt="защитный код" class="cap4a"/>
    33.         </div>
    34.         <!-- /картинка защитного кода -->
    35.     <input type="text" name="key" size="20" maxlength="100" value="" class="key"><br>
    36.     <input type="submit" name="register" value="Регестрация" class="button">
    37.     <input type="button" name="cancel" value="Отмена" class="button" onclick="parent.location='../sign.php'">
    38.     </div>
    39. </form>
    40.  
    41. <!--/Вывод форм для ввода данных-->
    42. </head>
    43. <div id="error">
    44. <?php
    45. //проверка на нажитие кнопки регестрации
    46. if(isset($_POST['register'])){
    47. //подключение к бд
    48. include "mysql/mysql.php";
    49.  
    50. //перенос данных из формы в переменную    
    51. $login=$_POST['login'];
    52. $email=$_POST['email'];
    53. $password=$_POST['password'];
    54. $password2=$_POST['password2'];
    55. $key=$_POST['key'];
    56.    
    57.     //проверка на заполненые поля
    58.   if (!empty($key))
    59.  {
    60.         //проверка капчи
    61.       if($_SESSION['secpic']==strtolower($key))
    62.         {
    63.             $kod=1;
    64.         }
    65.         else
    66.             {
    67.                 echo'<p class="error">-неверно введены цифры с картинки </p>';
    68.             }
    69.   }
    70.   else
    71.   {
    72.           echo'<p class="error">-символы с картинки не введенны </p>';
    73.   }
    74.   //если символы с капчи введены верно тогда проверяются остольные поля
    75.   //сначало заполнены ли они вообще а патом уже то что в них написанно
    76.   if($kod==1)
    77.   {
    78.      //проверка логина на повторение в таблице(логин будет уникальным)
    79.    if (empty($login))
    80.    {
    81.    echo'<p class="error">-Login не введен</p>';
    82.    }else
    83.         {
    84.         $result=mysql_query("select login from active where login= '".$login."'");
    85.         if(mysql_num_rows($result)>0)
    86.         {
    87.             echo'<p class="error">-Извените данный логин уже используется</p>';
    88.         }else{$log=1;}
    89.    }
    90.     //проверка мыла
    91.    if (!empty($email))
    92.     {
    93.         //проверка мыла по шаблону
    94.         if (!preg_match("/[0-9a-z_]+@[0-9a-z_^\.]+\.[a-z]{2,3}/i", $email))
    95.          {
    96.         echo '<p class="error">-E-mail не введен или введен неверно</p>';
    97.         }
    98.         else
    99.         {
    100.         //проверка мыла на повторение в базе(мыло является уникальным)
    101.         $result=mysql_query("select mail from users where mail= '".$email."'");
    102.         $result2=mysql_query("select imeil from active where imeil= '".$email."'");
    103.             if(mysql_num_rows($result)>0 or mysql_num_rows($result2)>0)
    104.             {
    105.                 echo'<p class="error">-Извените данный e-mail уже занят</p>';
    106.                
    107.             }else{$m=1;}
    108.         }
    109.     }else{echo'<p class="error">-E-mail не введен</p>'; }
    110.     //проверка пасса
    111.     $pas=1;
    112.   if (empty($password))
    113.    {
    114.             echo'<p class="error">-password не введен</p>';
    115.    }
    116.    else
    117.    {
    118.         //проверка на длинну пароля не менее 3-х не более 16-ти
    119.         if(strlen($password)<3)
    120.         {
    121.             echo '<p class="error">-Длина пароля должна быть не менее 3-х символов !</>';$pas=0;
    122.         }
    123.         else
    124.         {
    125.             if(strlen($password)>16)
    126.                 {
    127.                     echo '<p class="error">-Длина пароля должна быть не более 16-х символов !</p>';$pas=0;
    128.                 }
    129.                 else
    130.                 {
    131.                    if($pas!=0)
    132.                     {      
    133.                     //проверка на правельность ввода потверждающего пароля
    134.                         if ($password2!=$password)
    135.                             {
    136.                                 echo'<p class="error">-Не совпадают пароли</p>';
    137.                             } else{$p=1;}
    138.                     }
    139.                 }
    140.      
    141.         }
    142.    
    143.     }
    144.   }
    145.  
    146.   //если все требования к заполнению форм выполнены то выполняется следующее
    147. if($kod==1&&$m==1&&$p==1&&$log==1)
    148. {
    149. //заносим данные во временную таблицу активации с уникальным кодом активации
    150. $dat=date("y.m.d");
    151.  $checkSum=md5(base64_encode(rand(55555,99999)));
    152.  $query="insert into active (login,password,imeil,activekod,date) values('$login','$password','$email','$checkSum','$dat')";
    153.  mysql_query($query);
    154.  
    155.  //формировка и отправка письма
    156.     $month=date("Y-m-d", mktime(0, 0, 0, date("m"), date("d")+7, date("Y")));
    157.     $silka="http://".$_SERVER['HTTP_HOST']."/city-chat/register/us2.php?checkSum=".$checkSum."&login=".$login."";
    158.     $texst="<p>Сегодня ".date("m.d.y")." в ".date("H:i")."на сайте City-Chat.lg.ua \n
    159.     был зарегистрирован пользователь с вашим email'ом. Поэтому вы получили данное письмо. \n
    160.     Если вы не регистрировались на нашем сайте, то попросто проигнорируйте данное письмо, а если \n
    161.     же это были вы то перейдите по нижеприведённой ссылке.</p>
    162.  
    163.     <p>Активация аккаунт будет действителен до: ".$month.", после чего актевировать его будет невозможно будет невозможно !</p>
    164.  
    165.     <p>Ссылка для активации:\n
    166.     <a href=\"".$_SERVER['HTTP_HOST']."/city-chat/register/us2.php?checkSum=".$checkSum."&login=".$login."\">$silka</a></p>\n
    167.  
    168.     __________________________________________________________________________________________________
    169.  
    170.     <p>С уважением администрация City-Chat.com.ua\n
    171.     Email для контактов:<a href=\"mailto: [email=toh1napocht@yandex.ru]toh1napocht@yandex.ru[/email]\"> [email=toh1napocht@yandex.ru]toh1napocht@yandex.ru[/email] </a></p>
    172.     __________________________________________________________________________________________________
    173.  
    174.     <p>Данное сообщение было созданно автоматически и отвечать на него не стоит!!</p>
    175.     ";
    176.  
    177.     mail("$email", "Активация", "$texst" ,"Content-Type: text/html; charset=windows-1251","From: [email=city-chat@mail.ru]city-chat@mail.ru[/email]");
    178. //перенаправляем скрипт
    179.  
    180. header("Location: [url=http://]http://[/url]".$_SERVER['HTTP_HOST']."/city-chat/register/us2.php");
    181. }
    182.  
    183. }
    184.  
    185.  
    186.  
    187. ?>
    188. </div>
    189. <div id="info">
    190. <div id="div-inf-login">
    191. <span class="inf-login">-введите ваше уникальное имя</span>
    192. </div>
    193.  
    194. <div id="div-inf-mail">
    195. <span class="inf-email">-укажите ваш почтовый ящик на
    196. который будет отправленно письмо активации,
    197. вводите достоверные данные!</span>
    198. </div>
    199.  
    200. <div id="div-inf-pass">
    201. <span class="inf-pass">-введите ваш секретный пароль, который даст вам возможность входа на сайт, не забудьте его!</span>
    202. </div>
    203. <div id="div-inf-pass2">
    204. <span class="inf-pass2">-повторите ваш пароль</span>
    205. </div>
    206. <div id="div-inf-cap4a">
    207. <span class="inf-cap4a">-введите символы с картинки</span>
    208. </div>
    209. </div>
    210. </div>
    211. </div>
    212. </html>
     
  2. engager

    engager Активный пользователь

    С нами с:
    21 янв 2009
    Сообщения:
    1.106
    Симпатии:
    1
    для новичка неплохо. продолжай в том же духе, и скоро будешь чувствовать себя уверенно.
    критиковать и что-то улучшать можно всегда и все. главное помнить, лучшее - враг хорошего.

    я бы посоветовал обратить внимание на подобное

    PHP:
    1. $result=mysql_query("select mail from users where mail= '".$email."'");
    здесь потенциальная дырка в безопасности, ибо параметры у тебя не фильруются. почитай на досуге об sql-инъекциях.

    и еще. не стоит пользователю конкретизировать, что у него неправильно введено имя пользователя или пароль. опять же из соображений безопасности. просто одним селектом аутентификация производится:
    [sql]select null from users where login=$email and passwd = $pass [/sql]
    ну это условно. если запрос вернул ноль строк, говорим юзеру - Фэйл, имя пользователя или пароль не верно
    и все.
     
  3. karakh

    karakh Активный пользователь

    С нами с:
    11 дек 2007
    Сообщения:
    1.344
    Симпатии:
    0
    навскидку
    1. возможна sql injection при записи во временную таблицу активации, при проверке уникальности логина и вообще при любом запросе.
    2. зачем нужна временная таблица? проще сделать в основной таблице users пару дополнительных полей - activation_code и is_active.
    3. зачем отдельные запросы для проверки уникальности? Сделай эти поля уникальными в базе, пиши в нее запись и перехватывай sql exception.
    4. зачем if($kod==1&&$m==1&&$p==1&&$log==1)? Вполне хватает одной переменной.
     
  4. bookin

    bookin Активный пользователь

    С нами с:
    11 ноя 2009
    Сообщения:
    120
    Симпатии:
    0
    честно говоря пока что из слов про sql нифига мне не понятно(жаль, пропустил весь курс по sql ) про100 пока не читал, думаю через некоторое время пойму, "engager"- вообщем то там тока указывается что логин либо пароль введены или что пароль должен быть в диапазоне, но про пароль в диапазоне так же проверяет его jquery - ну типа проверка форм ,
    "karakh"-смогу ответить ток на 4-й пункт, не знаю, мне так проще видно какое условие не выполняется а какое нормально прошло, то при отладке попробуй найди если все в одну переменную заносить
     
  5. topas

    topas Активный пользователь

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
    bookin
    для начала прикинь, как можно разделить html и php. Это сейчас у тебя хорошо, всего 200 с небольшим строк кода. До 1000 дойдешь - сам запутаешься.
     
  6. bookin

    bookin Активный пользователь

    С нами с:
    11 ноя 2009
    Сообщения:
    120
    Симпатии:
    0
    спасибо всем
     
  7. topas

    topas Активный пользователь

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
    PHP:
    1. <?php
    2. if ( /*...*/ ){
    3.     //
    4. }
    5. else{
    6.     if ( /*...*/ ){
    7.         //
    8.     }
    9.     else {
    10.         if( /*...*/ ){
    11.             //
    12.         }
    13.         else{
    14.             if ( /*...*/ ){
    15.                 //
    16.                 if ( /*...*/ ){
    17.  
    Не самое удачное решение

    PHP:
    1. <?php
    2. if ($kod==1&&$m==1&&$p==1&&$log==1)
    3.  
    Именуйте переменные правильно
     
  8. bookin

    bookin Активный пользователь

    С нами с:
    11 ноя 2009
    Сообщения:
    120
    Симпатии:
    0
    topas а по вашему мнению какой вариант будет оптимальнее??
     
  9. topas

    topas Активный пользователь

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
    где-то так:

    PHP:
    1. <?php
    2.  
    3. if (isset($_POST['login'])){
    4.     action_registration();
    5. }
    6. else {
    7.     block_show_form();
    8. }
    9.  
    10. define('USER_EMPTY_LOGIN',      1 );
    11. define('USER_LOGIN_IS_SHORT',   2 );
    12. define('USER_EMPTY_PWD',        3 );
    13. define('USER_WRONG_CAPTCHA',    4 );
    14.  
    15. /**
    16.  * Регистрация пользователя
    17.  *
    18.  * @return bool
    19.  */
    20. function action_registration(){
    21.     $errors = array();
    22.     validate_user_login($errors);
    23.     validate_user_pwd($errors);
    24.     validate_user_captcha($errors);
    25.    
    26.     if (count($errors)){
    27.         block_show_errors($errors);
    28.         block_show_form();
    29.     }
    30.     else {
    31.         $user = create_user( $_POST['login'], $_POST['pwd'] );
    32.         send_user_message($user);
    33.         header('Location: /');
    34.         die;
    35.     }
    36. }
    37.  
    38. /**
    39.  * Проверить корректность логина
    40.  *
    41.  * @param $errors
    42.  * @return bool
    43.  */
    44. function validate_user_login(&$errors){
    45.     if (empty($_POST['login'])){
    46.         $errors[] = USER_EMPTY_LOGIN;
    47.         return false;
    48.     }
    49.    
    50.     if (strlen($_POST['login']) < 3){
    51.         $errors[] = USER_LOGIN_IS_SHORT;
    52.         return false;
    53.     }
    54.    
    55.     return true;
    56. }
    57.  
    58. /**
    59.  * Проверить корректность пароля
    60.  *
    61.  * @param $errors
    62.  * @return bool
    63.  */
    64. function validate_user_pwd(&$errors){
    65.     if (empty($_POST['pwd'])){
    66.         $errors[] = USER_EMPTY_PWD;
    67.         return false;
    68.     }
    69.    
    70.     return true;
    71. }
    72.  
    73. /**
    74.  * Проверить корректность каптчи
    75.  *
    76.  * @param $errors
    77.  * @return bool
    78.  */
    79. function validate_user_captcha(&$errors){
    80.     // ...
    81.        
    82.     return true;
    83. }
    84.  
     
  10. bookin

    bookin Активный пользователь

    С нами с:
    11 ноя 2009
    Сообщения:
    120
    Симпатии:
    0
    на сколько я заметел вы по большому счету про100 все вынесли в функции, я приму ваш вариант к сведению, и еще вопрос вой не самый удачный вариант а в чем могут быть проблемы при таком варианте??
     
  11. topas

    topas Активный пользователь

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
    да, да, да, конечно, вы правы!

    сложность поддержки такого кода, это основная проблема.

    К примеру возьмите 93 строчку своего кода:
    Код (Text):
    1. if (!empty($email)){
    Всё четко и понятно, "если не пуст email" (я так бы прочитал)

    Теперь возьмите 138 строчку и скажите: попадем ли мы сюда если email пуст?

    bookin, моя первая программа на php была точь в точь как ваша :) Я был счастлив и рад, думаю как и вы :)
    Но когда она выросла до 700-800 строк это был абзац. Я матерился на чём свет стоит: ничего не понятно, откуда что берется и куда что девается. Если изначальной целью было написать что-то хорошее, то под конец уже просто мечтал заставить это нагромождение работать, хоть как-то.

    Проверено практикой:
    1. следует избегать уровня вложенности условного оператора больше двух
    2. разбивайте свои программы на подпрограммы, выделяйте отдельные самодостаточные блоки
    3. избегайте больших функций. 30 - 50 строк кода в одной функции это много.
    4. читайте, Фаулера "Рефакторинг". Там есть необходимая вам информация.
     
  12. bookin

    bookin Активный пользователь

    С нами с:
    11 ноя 2009
    Сообщения:
    120
    Симпатии:
    0
    topas огромное спасибо за советы приму все к сведению)
     
  13. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
     
  14. topas

    topas Активный пользователь

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
    Volt(220)
    +1, Макконнела тоже нужно читать

    В своей практике (так получается) 90% методов умещаются в 10-15 строк
    Когда количество кода в методе растёт я обычно выделяю функционал из метода в разные методы. Сигналом к выделению кода очень часто служит количество строк. Где-то строк 50 и я уже себя чувствую неуютно. Конечно, есть и другие сигналы, но это отдельная тема.

    Конечно, я писал функции и в 300 строк :) хотите в них разобраться? нет? Вот и я не хочу. А "сложные алгоритмы требующие написания именно в одной функции и именно 200 строк" - это больше похоже на бред, уж извините.

    Решающий фактор для меня это не ошибки, а скорость их устранения. Ошибки были есть и будут, а вот поиск и исправление ошибок это хороший аргумент, в пользу коротких методов, конечно.

    Volt(220), как вы считаете, что проще понять начинающему программисту: вот эта цитата или оговорка про 50 строк?

    UPD> Давайте отдельную тему, если желаете побеседуем
     
  15. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
    Да тут особо не о чем беседовать. =))

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

    PS:
    строго говоря это не я писал. =))
     
  16. topas

    topas Активный пользователь

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
    согласен, но ведь подписались :)

    Да, я тоже не хочу. Пусть принимают как факты.
     
  17. Elkaz

    Elkaz Старожил
    Команда форума Модератор

    С нами с:
    26 июн 2006
    Сообщения:
    3.373
    Симпатии:
    0
    Адрес:
    Баку, Азербайджан
    topas
    +1 тебе
     
  18. bookin

    bookin Активный пользователь

    С нами с:
    11 ноя 2009
    Сообщения:
    120
    Симпатии:
    0
    те люди которые не совсем глупые и php это не первый язык думаю должны понять что сказанное не нужно принимать как факт =)
     
  19. karakh

    karakh Активный пользователь

    С нами с:
    11 дек 2007
    Сообщения:
    1.344
    Симпатии:
    0
    и сами это знают.
     
  20. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
    Даже у таких людей периодически какая-нибудь логичная фраза умного дядьки западает и начинает быть истиной и целью.

    Ну и потом, кто сказал что этот форум будут читать только "не совсем глупые" и у которых "php это не первый язык"?
     
  21. bookin

    bookin Активный пользователь

    С нами с:
    11 ноя 2009
    Сообщения:
    120
    Симпатии:
    0
    Volt(220) никто этого не говорил, и прави
    льно что уточнили.

    у меня еще вопрос назрел))

    engager

    сказал что не стоит конкретизировать какое поле не правильно заполнено из=за соображения безопасности, а в чем может быть угроза при таком варианте??
     
  22. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
    Подобрать два элемента сложнее чем один.
    Так, грубо говоря, если есть списки всех возможных (самых частых) логинов(например, x=1000 штук) и паролей(y=2000 штук), то для подбора пары логин-пароль в худшем случае нужно x*y=2 000 000 попыток.
    Если же система выдает информацию о том что неверно, то в худшем случае нужно x+y-1=2999 попыток.
     
  23. Костян

    Костян Активный пользователь

    С нами с:
    12 ноя 2009
    Сообщения:
    1.724
    Симпатии:
    1
    Адрес:
    адуктО
    атака по словарю
     
  24. engager

    engager Активный пользователь

    С нами с:
    21 янв 2009
    Сообщения:
    1.106
    Симпатии:
    1
    именно. другими словами, что проще, подбирать пароль, зная имя пользователя, или подбирать и то и другое, не зная ничего?
     
  25. bookin

    bookin Активный пользователь

    С нами с:
    11 ноя 2009
    Сообщения:
    120
    Симпатии:
    0
    все въехал, спасибо за подсказки