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

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Авторизация. Как вам код?

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Без описания
Serpanok
Отправлено: 17 Июня, 2011 - 09:51:21
Post Id


Частый гость


Покинул форум
Сообщений всего: 133
Дата рег-ции: Февр. 2011  
Откуда: Красный Лиман, Украина


Помог: 0 раз(а)




Всем привет!

Посмотрите код, и скажите какие тут есть щели для взломщика и как их можно латануть?
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>

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

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

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

Заранее спасибо!
 
 Top
OrmaJever
Отправлено: 17 Июня, 2011 - 10:16:21
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


Помог: 299 раз(а)




всё вроде ничего, только эта функция немного удивила.
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-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
Serpanok
Отправлено: 17 Июня, 2011 - 10:25:39
Post Id


Частый гость


Покинул форум
Сообщений всего: 133
Дата рег-ции: Февр. 2011  
Откуда: Красный Лиман, Украина


Помог: 0 раз(а)




OrmaJever, спасибо терь буду спать спокойно =_)))
 
 Top
OrmaJever
Отправлено: 17 Июня, 2011 - 11:11:01
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


Помог: 299 раз(а)




если решили все поля с базы записывать в сесию то можно заменить
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.  

и будет меньше строк Улыбка


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
Мелкий Супермодератор
Отправлено: 17 Июня, 2011 - 11:13:27
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




А может проще будет вообще $_SESSION["priv"]=$myrow_login ? Подмигивание


-----
PostgreSQL DBA
 
 Top
Stierus Супермодератор
Отправлено: 17 Июня, 2011 - 11:58:55
Post Id



Рекордсмен по количеству сообщений за 7 дней


Покинул форум
Сообщений всего: 2132
Дата рег-ции: Дек. 2008  
Откуда: Москваль


Помог: 52 раз(а)




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%
 
My status
 Top
DeepVarvar Супермодератор
Отправлено: 17 Июня, 2011 - 12:27:40
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




Stierus пишет:
Исключительно mysql выборке не стоит верить на 100%

Почему?
 
 Top
Stierus Супермодератор
Отправлено: 17 Июня, 2011 - 12:41:18
Post Id



Рекордсмен по количеству сообщений за 7 дней


Покинул форум
Сообщений всего: 2132
Дата рег-ции: Дек. 2008  
Откуда: Москваль


Помог: 52 раз(а)




Потому что никто не может дать гарантии, что ты учел все и sql инъекции нет. Даже тупо поменяв местами логин и пасс, ты себя обезопасишь в разы, ибо в пассе лежит md5, мы уверены, что там все чисто и что отсев хотя бы по паролю точно будет.
(Добавление)
а если есть iconv - темболее, я не знаю ни одного человека, который бы полностью знал механизм работы этой функции и мог на 100% предвидеть результат его работы на строке, полностью зависимой от пользователя.
 
My status
 Top
OrmaJever
Отправлено: 17 Июня, 2011 - 13:26:19
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


Помог: 299 раз(а)




Мелкий пишет:
А может проще будет вообще $_SESSION["priv"]=$myrow_login ?

ппц меня на смех потянуло. Как всё бывает просто Закатив глазки


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
Serpanok
Отправлено: 17 Июня, 2011 - 15:25:08
Post Id


Частый гость


Покинул форум
Сообщений всего: 133
Дата рег-ции: Февр. 2011  
Откуда: Красный Лиман, Украина


Помог: 0 раз(а)




Stierus, переделал как ты сказал. Реально это же даже если в пас и написань sql инекцию она не сработает потому что мы её конвентим md5, а логин я проверяю потом.
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Напишите за меня, пожалуйста »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB