я с функциями еще не работал =( на данном этапе норм ? какие функции тут нужны? для проверок ошибок точно )
Согласен, жесть Обязательно начну писать функции и посыпятся вопросы рекой)) На данный момент я хочу осилить самое простое ) мб уже часть осилил, если я начну еще и функции писать то вообще запутаюсь =)
А вдруг мы отправляем не форму авторизации, а другую форму? Проверяй конкретное поле PHP: <? if (isset($_POST['login'])) {
использование функций приводит чаще к тому что путаться сложнее, главное немного думать когда их пишешь. а также писать тесты и заниматься рефакторингом
[vs], ну отправишь ты, а толку, для проверки используется $_POST['login'] и $_POST['password'] + captcha. Если я отправлю $_POST['name'] ничего ведь не изменится?)
тогда на этой строке сгенерируется 3 ошибки Notice, потому что login, password и captha в $_POST не будет. Поэтому правильно кнопке submit назначать name, и проверять её наличие в $_POST - чтобы однозначно идентифицировать форму.
Я конечно понимаю, что тот нубский феерический капец, что творился в теме про пароли, может смутить, но поверьте - пароль солить нужно. Ответ зачем в поиске по этому форуму и в интернете. Хотя я всегда советую не изобретать велосипед и пользоваться системным crypt. http://ru.php.net/manual/en/function.crypt.php А в базе проверка пароля будет ENCRYPT($password, password) = password
1. к безопасности отношения не имеет, но зачем тебе такая громоздкая проверка ошибок (строки 19-33). имхо в разы проще сделать что-то вроде PHP: <? $err_msg=''; if(strlen($login)< 3) { $err_msg.=' - слишком короткий логин <br>' } if(strlen($pass)< 6) { $err_msg.=' - слишком короткий пароль <br>' } ... if ($err_msg) echo $err_msg; 2. логин обычно делают регистронезависимым. В пароле регистр важен, в логине - нет. 3. подозреваю что нет смысла прогонять $pass через mysql_real_escape_string() потому что $pass - это уже хэш md5, там не должно быть ничего ломающего базу. 4. PHP: <? $auth_usr01 = mysql_query("SELECT COUNT(*) FROM users WHERE login = '".mysql_real_escape_string($login)."' AND password = '".mysql_real_escape_string($pass)."'"); // Проверка правильно ли ввели данные. $auth_usr=mysql_result($auth_usr01, 0); Зачем? ты все равно через пару строк берешь этого же юзера по логину. Поэтому лучше PHP: <? $get_id01 =mysql_query("SELECT id_item FROM users WHERE login = '".mysql_real_escape_string($login)."' AND password = '.$pass."'"); if ($get_id = mysql_fetch_row($get_id01)) { $_SESSION['user_id'] = $get_id[0]; header('Location: [url=http://mysite.ru/']http://mysite.ru/'[/url]); }else { // Если произошла ошибка при авторизации ...} Ну и плюс соль, разумеется.
Спасибо На ошибках люди учатся, а тут и раздел подходящий где еще мну поправят) Проблема только в том, что я не могу тормозить скрипт скажем если ошибка. Если ставлю параметр exit(); двиг на котором делаю ругается =)
Как-то так PHP: <?php function main($err="") { if (isset($_SESSION['user_id'])) { echo "<div id=\"error\" style=\"width: 192px;\"><b>Вы уже авторизованы на сайте!</b></div>"; } else { if ($err!="") { echo $err; } echo "\n<h2 class=\"first\">Авторизация на сайте</h2> \n<div style=\"font-size:12px;\"> <form name=\"register\" method=\"post\" action=\"index.php?do=auth\"> <div>Логин:<br><input name=\"login\" type=\"text\" value=\"".$_POST['login']."\" MAXLENGTH=\"16\" style=\"border:1px solid #ccc;\"></div> <div>Пароль:<br><input name=\"password\" type=\"password\" MAXLENGTH=\"20\" style=\"border:1px solid #ccc;\"></div> <div>Защитный код<br> <img src=\"http://mysite.ru/plugins/captcha/captcha.php\" alt=\"captcha\" style=\"border: 1px solid #ccc;\"><br> <input name=\"captcha\" type=\"text\" MAXLENGTH=\"5\" style=\"border:1px solid #ccc;width:140px;\"></div> <div><input type=\"submit\" value=\"Войти\"></div> </form> </div>"; } } function auth() { if (isset($_SESSION['user_id'])) { header('Location: [url=http://mysite.ru/']http://mysite.ru/'[/url]); } // Назначаем переменные и используем trim для удаления пробелов $login = trim($_POST['login']); $pass = trim($_POST['password']); $captcha = $_POST['captcha']; // Проверяем на ошибки $err .= (strlen($login) >= 3 && strlen($login) <= 16) ? "" : "Логин не меньше 3-х и не больше 16-ти символов<br>"; $err .= (strlen($pass) >= 6 && strlen($pass) <= 20) ? "" : "Пароль не меньше 6-ти и не больше 20-ти символов<br>"; $err .= ($_SESSION["captcha"]!==$captcha) ? "Неправильный код<br>" : ""; // Если есть ошибка то сообщим if ($err != "") { main($err); } else { $res = mysql_query("SELECT id_item FROM users WHERE login = '".mysql_real_escape_string($login)."' AND password = '".md5($pass)."'"); // Проверка правильно ли ввели данные. $auth_usr = mysql_result($res, 0); // Если все ок то... if ($auth_usr == "1") { $get_id = mysql_fetch_row($res); // Поместим в сессию ID этого авторизованного пользователя $_SESSION['user_id'] = $get_id[0]; // Перенаправляем пользователя на главную страницу header('Location: [url=http://mysite.ru/']http://mysite.ru/'[/url]); } } } switch($_GET['do']) { case "auth" : auth(); break; default: main(); break; } ?>
Воспринимаю это как личный вызов. Про нубятину не надо. Пароль нужно солить не всегда. Надо было внимательно читать. В данном случае - нужно.
Пароль нужно солить всегда, когда мы его где-то храним. Несоленый md5 вскрывается подбором коллизии за вполне себе ограниченный интервал времени по радужным таблицам. Суть соли в том, что нам приходится получать не просто коллизию, а вполне себе определнную колизию содержащую в себе фиксированную строку (соль), что мгновенно безумно увеличивает время подбора, так как старые радужные тут не работают. Именно по-этому и не ставится вопрос секретности соли, а вот разные соли для разных паролей - приветствуются, хотя бы с целью маскировки хешей от одинаковых паролей. Все, никакого обсуждения, сказанное факт, который нужно напечатать, повестить перед монитором и смотреть, когда пишется новая авторизация. А crypt дает потрясающую штуку - свободную миграцию паролей между двумя системами, которые используют crypt. Чем больше людей будет использовать это, тем проще всем будет жить. Аминь.
Если я буду уверен в том, что вскрыть БД мою не смогут, то и соль ставить не буду, мне и md5 хватит =)
Ага, пропустил. Т.е. если вы хотите конкретно мнение про вас - то вы не умеете выражать (формулировать) свои мысли. И желательно "по-русски". А то снап какой-то... А ответ прост - ваш алгоритм не защищает от построения радужных таблиц, по которым все тысячи украденных паролей легко и непринужденно вскрываются. Соль - защищает, ибо по сути удлиняет пароль, т.е. радужные придется строить по всем значениями соли.
Зачем искать коллизию? Чтобы в поле пароль, где надо вводить Код (Text): p@$$w0rd и ввести Код (Text): p@$$w0rd если у нас соль, то в БД хранится хэш от Код (Text): p@$$w0rd65536 хакер находит эту строку и вводит Код (Text): p@$$w0rd65536 если у нас есть соль, мы сравним уже Код (Text): md5("p@$$w0rd65536") == md5("p@$$w0rd6553665536") хэши не совпадут, хакер зря потратил время. Теперь посмотрим с другой стороны. Найдя по одной коллизии для сотни хэшей, хакер наверняка найдет несколько паролей пользователя. Если каждый из них будет содержать 65536, какой нужен IQ хакеру, чтобы понят, что это - соль? Вычислив соль, можно вычислить исходные пароли, добавляя в переборе к каждому варианту соль. С такой точки зрения, лучше на несколько раз сделать md5 пароля.
[vs], 1. соль не секретна, хранится рядом с хешом пароля в открытом виде, 2. соль разная для каждого хеша