Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Авторизация. Как вам код?
Форумы портала PHP.SU » PHP » Напишите за меня, пожалуйста » Авторизация. Как вам код?

Страниц (1): [1]
 

1. Serpanok - 17 Июня, 2011 - 09:51:21 - перейти к сообщению
Всем привет!

Посмотрите код, и скажите какие тут есть щели для взломщика и как их можно латануть?
PHP:
скопировать код в буфер обмена
  1. <?
  2. function screening($text) {
  3.         return trim(iconv("utf-8", "Windows-1251", htmlspecialchars(addslashes(stripslashes($text)))));
  4. }
  5.  if($_GET["mod"] == "login" and isset($_POST["login"]) and isset($_POST["pass"]) and !isset($_SESSION["id"]))
  6. {
  7.         $login = screening($_POST["login"]);
  8.         $pass = screening($_POST["pass"]);     
  9.         if($login == "" or $login == " " or $pass == "" or $pass == " ")
  10.         {
  11.                 $_SESSION["see"] = "Проверьте правильность заполнения формы!";
  12.                 exit(header("Location: /"));
  13.         }
  14.         $pass = md5($pass);
  15.        
  16.         $result_login = mysql_query("SELECT * FROM users WHERE login='$login' and pass='$pass'",$db);
  17.         $rows_login = mysql_num_rows($result_login);
  18.         if($rows_login == 1)
  19.         {
  20.                 $myrow_login = mysql_fetch_array($result_login);
  21.                 $_SESSION["id"] = $myrow_login["id"];
  22.                 $_SESSION["priv"]       = array(
  23.                         'add'                   => $myrow_login["add"],
  24.                         'edit'                  => $myrow_login["edit"],
  25.                         'add_ostatok'   => $myrow_login["add_ostatok"],
  26.                         'vrabote'               => $myrow_login["vrabote"],
  27.                         'vsklade'               => $myrow_login["vsklade"],
  28.                         'rept'                  => $myrow_login["rept"],
  29.                         'archive'               => $myrow_login["archive"],
  30.                         'order_adds'    => $myrow_login["order_adds"],
  31.                         'settings'              => $myrow_login["settings"],
  32.                         'graph'                 => $myrow_login["graph"],
  33.                         'graph_add'             => $myrow_login["graph_add"],
  34.                         'print'                 => $myrow_login["print"],
  35.                         'docs'                  => $myrow_login["docs"]
  36.                 );
  37.                 exit(header("Location: /"));
  38.         }
  39.         else
  40.         {
  41.                 $_SESSION["see"] = "Неправельный логин или пароль!";
  42.                 exit(header("Location: /"));   
  43.         }
  44. }
  45. if(isset($_SESSION["see"])) echo $_SESSION["see"];
  46. ?>
  47.  
  48. <form action="/?mod=login" method="post">
  49. Логин:<input name="login" type="text" />Пароль:<input name="pass" type="password" /><input type="submit" value="Вход" />
  50. </form>

Обработчик и форма находятся на разных страницах, тут я их кинул на одну для вашего удобства.

Помогите сделать авторизацию на высшем уровне(просто там конфиденциальная информация).

Если нужно ещё какая инфа, скажу...

Заранее спасибо!
2. OrmaJever - 17 Июня, 2011 - 10:16:21 - перейти к сообщению
всё вроде ничего, только эта функция немного удивила.
Serpanok пишет:
PHP:
скопировать код в буфер обмена
  1. function screening($text) {
  2.         return trim(iconv("utf-8", "Windows-1251", htmlspecialchars(addslashes(stripslashes($text)))));
  3. }

1) удаляем экранизирование
2) экранизируем
3) переводим в html сущьности
4) меняем кодировку А?!
5) наконецто удаляем пробелы

Я бы предложил так
PHP:
скопировать код в буфер обмена
  1. function screening($text) {
  2.         return get_magic_quotes_gpc() ? trim($text) : mysql_escape_string(trim($text));
  3. }
3. Serpanok - 17 Июня, 2011 - 10:25:39 - перейти к сообщению
OrmaJever, спасибо терь буду спать спокойно =_)))
4. OrmaJever - 17 Июня, 2011 - 11:11:01 - перейти к сообщению
если решили все поля с базы записывать в сесию то можно заменить
PHP:
скопировать код в буфер обмена
  1.                 $_SESSION["priv"]       = array(
  2.                         'add'                   => $myrow_login["add"],
  3.                         'edit'                  => $myrow_login["edit"],
  4.                         'add_ostatok'   => $myrow_login["add_ostatok"],
  5.                         'vrabote'               => $myrow_login["vrabote"],
  6.                         'vsklade'               => $myrow_login["vsklade"],
  7.                         'rept'                  => $myrow_login["rept"],
  8.                         'archive'               => $myrow_login["archive"],
  9.                         'order_adds'    => $myrow_login["order_adds"],
  10.                         'settings'              => $myrow_login["settings"],
  11.                         'graph'                 => $myrow_login["graph"],
  12.                         'graph_add'             => $myrow_login["graph_add"],
  13.                         'print'                 => $myrow_login["print"],
  14.                         'docs'                  => $myrow_login["docs"]
  15.                 );

на
PHP:
скопировать код в буфер обмена
  1.  
  2. foreach($myrow_login as $k => $v) $_SESSION["priv"][$k] => $v;
  3.  

и будет меньше строк Улыбка
5. Мелкий - 17 Июня, 2011 - 11:13:27 - перейти к сообщению
А может проще будет вообще $_SESSION["priv"]=$myrow_login ? Подмигивание
6. Stierus - 17 Июня, 2011 - 11:58:55 - перейти к сообщению
1. конвертация кодировок, почитайте http://ru2.php.net/manual/en/fun...iconv.php#103860 , вдруг наткнетесь на что-то интересное в комментариях.
2. $result_login = mysql_query("SELECT * FROM users WHERE login='$login' and pass='$pass'",$db);

я бы искал только по логину, потом сравивал бы пароли, полученные из бд с паролем, полученным от пользователя. Исключительно mysql выборке не стоит верить на 100%
7. DeepVarvar - 17 Июня, 2011 - 12:27:40 - перейти к сообщению
Stierus пишет:
Исключительно mysql выборке не стоит верить на 100%

Почему?
8. Stierus - 17 Июня, 2011 - 12:41:18 - перейти к сообщению
Потому что никто не может дать гарантии, что ты учел все и sql инъекции нет. Даже тупо поменяв местами логин и пасс, ты себя обезопасишь в разы, ибо в пассе лежит md5, мы уверены, что там все чисто и что отсев хотя бы по паролю точно будет.
(Добавление)
а если есть iconv - темболее, я не знаю ни одного человека, который бы полностью знал механизм работы этой функции и мог на 100% предвидеть результат его работы на строке, полностью зависимой от пользователя.
9. OrmaJever - 17 Июня, 2011 - 13:26:19 - перейти к сообщению
Мелкий пишет:
А может проще будет вообще $_SESSION["priv"]=$myrow_login ?

ппц меня на смех потянуло. Как всё бывает просто Закатив глазки
10. Serpanok - 17 Июня, 2011 - 15:25:08 - перейти к сообщению
Stierus, переделал как ты сказал. Реально это же даже если в пас и написань sql инекцию она не сработает потому что мы её конвентим md5, а логин я проверяю потом.

 

Powered by ExBB FM 1.0 RC1