За последние 24 часа нас посетили 19445 программистов и 1666 роботов. Сейчас ищут 1203 программиста ...

Проверьте скрипт авторизации, пожалуйста)

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

  1. Invision

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

    С нами с:
    26 фев 2009
    Сообщения:
    1.437
    Симпатии:
    1
    Адрес:
    Томск
    -- Позор многолетней давности --
     
  2. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.557
    Симпатии:
    631
    отформатируй код и заверни в функции
     
  3. Invision

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

    С нами с:
    26 фев 2009
    Сообщения:
    1.437
    Симпатии:
    1
    Адрес:
    Томск
    я с функциями еще не работал =( на данном этапе норм ?:) какие функции тут нужны? для проверок ошибок точно )
     
  4. Gromo

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

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
    вот это даа...

    хотя я бы сделал две вещи - проверки/условия покороче и отступы расставил
     
  5. Invision

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

    С нами с:
    26 фев 2009
    Сообщения:
    1.437
    Симпатии:
    1
    Адрес:
    Томск
    Согласен, жесть :D
    Обязательно начну писать функции и посыпятся вопросы рекой))

    На данный момент я хочу осилить самое простое ) мб уже часть осилил, если я начну еще и функции писать то вообще запутаюсь =)
     
  6. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.557
    Симпатии:
    631
    А вдруг мы отправляем не форму авторизации, а другую форму? Проверяй конкретное поле
    PHP:
    1. <?
    2. if (isset($_POST['login'])) {
     
  7. VItalijs

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

    С нами с:
    17 дек 2008
    Сообщения:
    244
    Симпатии:
    0
    Адрес:
    Рига, Латвия
    использование функций приводит чаще к тому что путаться сложнее, главное немного думать когда их пишешь. а также писать тесты и заниматься рефакторингом :D
     
  8. Invision

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

    С нами с:
    26 фев 2009
    Сообщения:
    1.437
    Симпатии:
    1
    Адрес:
    Томск
    [vs], ну отправишь ты, а толку, для проверки используется $_POST['login'] и $_POST['password'] + captcha. Если я отправлю $_POST['name'] ничего ведь не изменится?)
     
  9. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.557
    Симпатии:
    631
    тогда на этой строке
    сгенерируется 3 ошибки Notice, потому что login, password и captha в $_POST не будет.
    Поэтому правильно кнопке submit назначать name, и проверять её наличие в $_POST - чтобы однозначно идентифицировать форму.
     
  10. MiksIr

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

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    Я конечно понимаю, что тот нубский феерический капец, что творился в теме про пароли, может смутить, но поверьте - пароль солить нужно. Ответ зачем в поиске по этому форуму и в интернете. Хотя я всегда советую не изобретать велосипед и пользоваться системным crypt.
    http://ru.php.net/manual/en/function.crypt.php
    А в базе проверка пароля будет
    ENCRYPT($password, password) = password
     
  11. karakh

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

    С нами с:
    11 дек 2007
    Сообщения:
    1.344
    Симпатии:
    0
    1. к безопасности отношения не имеет, но зачем тебе такая громоздкая проверка ошибок (строки 19-33). имхо в разы проще сделать что-то вроде
    PHP:
    1. <?
    2. $err_msg='';
    3. if(strlen($login)< 3) { $err_msg.=' - слишком короткий логин <br>' }
    4. if(strlen($pass)< 6) { $err_msg.=' - слишком короткий пароль <br>' }
    5. ...
    6. if ($err_msg) echo $err_msg;
    2. логин обычно делают регистронезависимым. В пароле регистр важен, в логине - нет.
    3. подозреваю что нет смысла прогонять $pass через mysql_real_escape_string() потому что $pass - это уже хэш md5, там не должно быть ничего ломающего базу.
    4.
    PHP:
    1. <?
    2. $auth_usr01 = mysql_query("SELECT COUNT(*) FROM users WHERE login = '".mysql_real_escape_string($login)."' AND password = '".mysql_real_escape_string($pass)."'"); // Проверка правильно ли ввели данные.
    3.  $auth_usr=mysql_result($auth_usr01, 0);
    Зачем? ты все равно через пару строк берешь этого же юзера по логину. Поэтому лучше

    PHP:
    1. <?
    2. $get_id01 =mysql_query("SELECT id_item FROM users WHERE login = '".mysql_real_escape_string($login)."' AND password = '.$pass."'");
    3. if ($get_id = mysql_fetch_row($get_id01)) {
    4.    $_SESSION['user_id'] = $get_id[0];
    5.    header('Location: [url=http://mysite.ru/']http://mysite.ru/'[/url]);
    6. }else { // Если произошла ошибка при авторизации ...}
    7.  
    Ну и плюс соль, разумеется.
     
  12. Invision

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

    С нами с:
    26 фев 2009
    Сообщения:
    1.437
    Симпатии:
    1
    Адрес:
    Томск
    Спасибо :) На ошибках люди учатся, а тут и раздел подходящий где еще мну поправят)
    Проблема только в том, что я не могу тормозить скрипт скажем если ошибка. Если ставлю параметр exit(); двиг на котором делаю ругается =)
     
  13. jenya777777

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

    С нами с:
    16 мар 2010
    Сообщения:
    562
    Симпатии:
    0
    А если так напишут <script>alert('xak')</script> или так <p style='top: 1000'>1</p>
     
  14. Invision

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

    С нами с:
    26 фев 2009
    Сообщения:
    1.437
    Симпатии:
    1
    Адрес:
    Томск
    Ничего не произойдет =)
     
  15. bkm

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

    С нами с:
    22 окт 2009
    Сообщения:
    299
    Симпатии:
    0
    Как-то так

    PHP:
    1. <?php
    2. function main($err="") {
    3.  
    4. if (isset($_SESSION['user_id'])) {
    5. echo "<div id=\"error\" style=\"width: 192px;\"><b>Вы уже авторизованы на сайте!</b></div>";
    6. } else {
    7.  
    8. if ($err!="") { echo $err; }
    9.  
    10. echo "\n<h2 class=\"first\">Авторизация на сайте</h2>
    11. \n<div style=\"font-size:12px;\">
    12. <form name=\"register\" method=\"post\" action=\"index.php?do=auth\">
    13. <div>Логин:<br><input name=\"login\" type=\"text\" value=\"".$_POST['login']."\" MAXLENGTH=\"16\" style=\"border:1px solid #ccc;\"></div>
    14. <div>Пароль:<br><input name=\"password\" type=\"password\" MAXLENGTH=\"20\" style=\"border:1px solid #ccc;\"></div>
    15. <div>Защитный код<br>
    16. <img src=\"http://mysite.ru/plugins/captcha/captcha.php\" alt=\"captcha\" style=\"border: 1px solid #ccc;\"><br>
    17. <input name=\"captcha\" type=\"text\" MAXLENGTH=\"5\" style=\"border:1px solid #ccc;width:140px;\"></div>
    18. <div><input type=\"submit\" value=\"Войти\"></div>
    19. </form>
    20. </div>";
    21. }
    22. }
    23.  
    24. function auth() {
    25. if (isset($_SESSION['user_id'])) { header('Location: [url=http://mysite.ru/']http://mysite.ru/'[/url]); }
    26.  
    27. // Назначаем переменные и используем trim для удаления пробелов
    28.  
    29. $login = trim($_POST['login']);
    30. $pass = trim($_POST['password']);
    31. $captcha = $_POST['captcha'];
    32.  
    33. // Проверяем на ошибки
    34.  
    35. $err .= (strlen($login) >= 3 && strlen($login) <= 16) ? "" : "Логин не меньше 3-х и не больше 16-ти символов<br>";
    36. $err .= (strlen($pass) >= 6 && strlen($pass) <= 20) ? "" : "Пароль не меньше 6-ти и не больше 20-ти символов<br>";
    37.  
    38. $err .= ($_SESSION["captcha"]!==$captcha) ? "Неправильный код<br>" : "";
    39.  
    40. // Если есть ошибка то сообщим
    41. if ($err != "") { main($err); } else {
    42.  
    43. $res = mysql_query("SELECT id_item FROM users WHERE login = '".mysql_real_escape_string($login)."' AND password = '".md5($pass)."'"); // Проверка правильно ли ввели данные.
    44. $auth_usr = mysql_result($res, 0);
    45.  
    46. // Если все ок то...
    47. if ($auth_usr == "1") {
    48.  
    49. $get_id = mysql_fetch_row($res);
    50.  
    51. // Поместим в сессию ID этого авторизованного пользователя
    52. $_SESSION['user_id'] = $get_id[0];
    53.  
    54. // Перенаправляем пользователя на главную страницу
    55. header('Location: [url=http://mysite.ru/']http://mysite.ru/'[/url]);
    56.  
    57. }
    58. }
    59. }
    60.  
    61. switch($_GET['do']) {
    62.     case "auth" : auth(); break;
    63.     default: main(); break;
    64. }
    65. ?>
     
  16. titch

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

    С нами с:
    18 дек 2010
    Сообщения:
    847
    Симпатии:
    0
    Воспринимаю это как личный вызов. Про нубятину не надо.
    Пароль нужно солить не всегда. Надо было внимательно читать. В данном случае - нужно.
     
  17. MiksIr

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

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    Пароль нужно солить всегда, когда мы его где-то храним. Несоленый md5 вскрывается подбором коллизии за вполне себе ограниченный интервал времени по радужным таблицам. Суть соли в том, что нам приходится получать не просто коллизию, а вполне себе определнную колизию содержащую в себе фиксированную строку (соль), что мгновенно безумно увеличивает время подбора, так как старые радужные тут не работают. Именно по-этому и не ставится вопрос секретности соли, а вот разные соли для разных паролей - приветствуются, хотя бы с целью маскировки хешей от одинаковых паролей. Все, никакого обсуждения, сказанное факт, который нужно напечатать, повестить перед монитором и смотреть, когда пишется новая авторизация.
    А crypt дает потрясающую штуку - свободную миграцию паролей между двумя системами, которые используют crypt. Чем больше людей будет использовать это, тем проще всем будет жить. Аминь.
     
  18. titch

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

    С нами с:
    18 дек 2010
    Сообщения:
    847
    Симпатии:
    0
    Вы пропустили абсолютно всё, что касалось снапа двух типов хэшей мимо ушей. Бессмысленный разговор.
     
  19. Invision

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

    С нами с:
    26 фев 2009
    Сообщения:
    1.437
    Симпатии:
    1
    Адрес:
    Томск
    Если я буду уверен в том, что вскрыть БД мою не смогут, то и соль ставить не буду, мне и md5 хватит =)
     
  20. MiksIr

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

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    Ага, пропустил. Т.е. если вы хотите конкретно мнение про вас - то вы не умеете выражать (формулировать) свои мысли. И желательно "по-русски". А то снап какой-то... А ответ прост - ваш алгоритм не защищает от построения радужных таблиц, по которым все тысячи украденных паролей легко и непринужденно вскрываются. Соль - защищает, ибо по сути удлиняет пароль, т.е. радужные придется строить по всем значениями соли.
     
  21. MiksIr

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

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    Вашу БД вскроют. Это не обсуждается.
     
  22. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.557
    Симпатии:
    631
    Зачем искать коллизию? Чтобы в поле пароль, где надо вводить
    Код (Text):
    1. p@$$w0rd
    и ввести
    Код (Text):
    1. p@$$w0rd
    если у нас соль, то в БД хранится хэш от
    Код (Text):
    1. p@$$w0rd65536
    хакер находит эту строку и вводит
    Код (Text):
    1. p@$$w0rd65536
    если у нас есть соль, мы сравним уже
    Код (Text):
    1. md5("p@$$w0rd65536") == md5("p@$$w0rd6553665536")
    хэши не совпадут, хакер зря потратил время.

    Теперь посмотрим с другой стороны. Найдя по одной коллизии для сотни хэшей, хакер наверняка найдет несколько паролей пользователя. Если каждый из них будет содержать 65536, какой нужен IQ хакеру, чтобы понят, что это - соль?
    Вычислив соль, можно вычислить исходные пароли, добавляя в переборе к каждому варианту соль.
    С такой точки зрения, лучше на несколько раз сделать md5 пароля.
     
  23. Invision

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

    С нами с:
    26 фев 2009
    Сообщения:
    1.437
    Симпатии:
    1
    Адрес:
    Томск
    MiksIr, это угроза?)
     
  24. MiksIr

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

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    [vs], 1. соль не секретна, хранится рядом с хешом пароля в открытом виде, 2. соль разная для каждого хеша
     
  25. MiksIr

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

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    Это реальность.