PHP.SU

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


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

> Без описания
mario
Отправлено: 25 Сентября, 2007 - 11:08:24
Post Id



Новичок


Покинул форум
Сообщений всего: 6
Дата рег-ции: Апр. 2007  


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




Доброго всем дня!

Прочитал на днях статьюПриемы безопасного программирования на PHP, оч полезная инфа для меня оказалась.
Пишу свой двиган уж пол года, и ни как не мог понять как лучше всего написать авторизацию, видел много вариантов, и сесии использовали люди и "печеньки", но так же находил статьи на ХАК-сайтах как это всё обходилось кралось и проще говоря взламывалось.
Первое что меня порадовало это :
Цитата:
Пользователь при каждом запросе, помимо другой информации (сообщение в чате, или список сообщений в гостевой книге), отправляет серверу свой uid. При этом в документе с формами ввода будет присутствовать, наряду с другими формами, тег вида:
<input type=hidden name=uid value=1234567890>

, ведь даже если злоумышленник посмотрит иходный сгенерированный текст в браузере, то он увидит число которое подобрать нельзя, потомучто оно с каждым новым заходом на сайт, меняеца!!!Подмигивание

Минусы статьи тоже есть!!!

Я обычно при авторизации использую "escape_string", так как одного
CODE (php):
скопировать код в буфер обмена
  1. preg_match("/[^(w)|(x7F-xFF)|(s)]/",$username)
не достаточно есть ещё
" ' " и " " " спец символы. Много статей про Инъекции
в Интернете есть!!!
Функция экранирует все спец-символы (у меня она не расписана а в простом варианте):
CODE (php):
скопировать код в буфер обмена
  1.      
  2. function escape($text){
  3.      return  @mysql_real_escape_string($text);
  4. }
  5.  


Реализовываеца просто:
CODE (php):
скопировать код в буфер обмена
  1. $_POST['password'] = escape($password);


А так же советую всем тестить скрипты с дерективой ,
а пользоваться ими с "display_errors=Off" и на всех функциях ставить значок "@"(это значит что если в функции какая либо ошибка она её не покажет на экране)
злоумышленник не увидит пути к файлам в которых есть ошибка!!!!


Ох да совсем забыл, про запросы в БД на помнить!!! Если вы ищите что то конкретно в большой таблице то лучше всего использовать в запросах LIMIT 1, так как можно сформировать запрос с функцией BECHMARKПодмигивание
Ну вот вроде пока ВСЁ!!!


-----
ЗАНАЯ id МОЖНО МНОГО ЧТО УЗНАТЬ ;)
 
 Top
EuGen Администратор
Отправлено: 25 Сентября, 2007 - 13:59:07
Post Id


Профессионал


Покинул форум
Сообщений всего: 9097
Дата рег-ции: Июнь 2007  
Откуда: Berlin


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




по поводу запросов - я всегда прежде чем вставлять в запрос какую бы то ни было переменную использую
, экранируя спец. символы. Кроме того, никогда не использую register_globals, так как небезопасно(почему - подумайте сами ...)
Далее, рекомендуется всегда инициализировать переменные, если требуется достичь большей безопасности. Приемы нехитрые, но помогают избежать многих "тупых" ошибок.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
valenok
Отправлено: 25 Сентября, 2007 - 15:00:12
Post Id



Здесь могла бы быть ваша реклама


Покинул форум
Сообщений всего: 4574
Дата рег-ции: Июль 2006  
Откуда: Israel


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




а я всегда использую Только mysql_escape_string
( или в крайних мерах mysql_real_escape_string ) и всё.
Я тоже против register globals, пока не наткнулся на программиста
который мне предоставлял хостинг и долго объяснял мне чем же регистр глобалс так хороши.
Так что вообще то как вам удобней, но c register_globals off легче.

Тестировать только с включёнными ошибками, загружать в выключенными. Для этого я обычно использую на сервере и на локалке разные .htaccess .

Насчёт LIMIT 1 - не очень то нужная вещь для безопастности.
Раньше я вообще писал так Select ... ; /*
Потом понял что если писать правильные запросы со всеми кавычками,
апострофами, заглавными буквами для ключевых слов, используя mysql_escape_string - то никто мне ничего не сделает, что бы он там не ввёл. Ещё естественно нужно проверять не пустые ли поля с логином и паролем.

Вот попробуйте подобрать сюда инъекцию
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. $login = mysql_escape_string($_POST['login']);
  4. $pass = mysql_escape_string($_POST['pass']);
  5. $q = "SELECT `id` FROM `usres` WHERE `login`='".$login."' AND `pass`='".$pass."'";


Вот фигу с маслом.
А теперь попробйуте сюда:
Цитата:
select id from users where login=$login and pass=$pass

где login и pass также экранированные строки.

http://www.php.net/manual/ru/security.php
http://phpclub[dot]ru/detail/article/php_security1
http://phpclub[dot]ru/detail/article/php_security2
http://phpclub[dot]ru/detail/article/php_security3
http://phpclub[dot]ru/detail/article/2003-12-01

http://phpclub[dot]ru/detail/article/2003-09-23
http://phpclub[dot]ru/detail/article/2001-03-06


-----
Truly yours, Sasha.
 
My status
 Top
EuGen Администратор
Отправлено: 25 Сентября, 2007 - 17:52:35
Post Id


Профессионал


Покинул форум
Сообщений всего: 9097
Дата рег-ции: Июнь 2007  
Откуда: Berlin


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




2 valenok - в подходе, когда в самом начале скрипта делается экранирование символов у введенных переменных, есть некоторый изъян - а именно: если мы будем использовать эти переменные где-либо еще, кроме как в запросе, нам это экранирование "испортит" ввод пользователя (бывает и так, что нам нужно сохранить именно исходные данные без экранирования). В Вашем примере я бы предпочел:
PHP:
скопировать код в буфер обмена
  1.  
  2. $login = $_POST['login'];
  3. $pass = $_POST['pass'];
  4. $q = "SELECT `id` FROM `usres` WHERE `login`='".mysql_escape_string($login)."' AND `pass`='".mysql_escape_string($pass)."'";
  5.  

Таким образом и данные сохраняются, и экранирование идет в нужном месте.
(А вообще то логин с паролем обычно нигде кроме БД не нужны ((* ... так что данный пример вполне вероятно что и так можно было оставить, но для общего случая лучше использовать экранирование только в тех местах, где оно нужно)


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
valenok
Отправлено: 25 Сентября, 2007 - 18:04:26
Post Id



Здесь могла бы быть ваша реклама


Покинул форум
Сообщений всего: 4574
Дата рег-ции: Июль 2006  
Откуда: Israel


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




EuGen
У меня веде escape стоит в самих запросах
Вышеприведенный код лишь пример того что инъекцировать написанный
правильными манерами запрос почти невозможно в отличии от безобразно написанного
select id from users where login=$login and pass=$pass
которого я всё чаще и чаще встречаю в различных скриптах.


-----
Truly yours, Sasha.
 
My status
 Top
EuGen Администратор
Отправлено: 25 Сентября, 2007 - 18:22:43
Post Id


Профессионал


Покинул форум
Сообщений всего: 9097
Дата рег-ции: Июнь 2007  
Откуда: Berlin


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




Цитата:
select id from users where login=$login and pass=$pass

это безобразие уже давно в серьезных проектах не встречал.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
mario
Отправлено: 26 Сентября, 2007 - 08:53:02
Post Id



Новичок


Покинул форум
Сообщений всего: 6
Дата рег-ции: Апр. 2007  


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




Радость Мужики, я рад что, вы подключились в эту тему!!!

CODE (php):
скопировать код в буфер обмена
  1.  
  2. $login = $_POST['login'];  
  3.  $pass = $_POST['pass'];  
  4.  $q = "SELECT `id` FROM `usres` WHERE `login`='".mysql_escape_string($login)."' AND `pass`='".mysql_escape_string($pass)."'";
  5.  


может лучше функцию написать и вызывать её в нужные нам номенты, когда нужно именно запрос в БД сделатьПодмигивание
функцию по ескейпу приводил выше^^(у меня она в классе БД)

Код php:
CODE (php):
скопировать код в буфер обмена
  1.  
  2. function auth($login, $passw){
  3.      global $sql;
  4.      $login= $sql->escape($login);
  5.      $passw= $sql->escape($passw);
  6. $user_login = mysql_query
  7.             ("SELECT * FROM `users` WHERE `user_name` ='$login' LIMIT 1");
  8.             if(mysql_num_rows($user_login) == 1){
  9. //если такой логин есть,
  10. //проверяем пароль
  11.             $user_passw = mysql_query ("SELECT '$login' FROM `users` WHERE
  12.                  `user_passw`='$passw' LIMIT 1");      
  13.              if(mysql_num_rows($user_passw) == 1){
  14.                         return TRUE;
  15.              }else{
  16.                         echo "<center>ошибка: <b>пароль не верный!</b></center>";
  17.                         return FALSE;
  18.                      }
  19. //Если же такого логина нет,
  20. //можно предложить зарегица, или ПНХ ;)
  21.             }else{
  22.                   echo "<center>ошибка: <b>такого логина в базе нет</b></center>";
  23.                   return FALSE;
  24. }
  25.  


-----
ЗАНАЯ id МОЖНО МНОГО ЧТО УЗНАТЬ ;)
 
 Top
EuGen Администратор
Отправлено: 26 Сентября, 2007 - 09:31:15
Post Id


Профессионал


Покинул форум
Сообщений всего: 9097
Дата рег-ции: Июнь 2007  
Откуда: Berlin


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




А смысл в такой функции? В sql-запросах не только логин/пароль бывает.
Например:
PHP:
скопировать код в буфер обмена
  1.  
  2. $sql="SELECT * FROM users WHERE user_id IN (SELECT user_id FROM $rights_table) AND reg_date BETWEEN '$start_date' AND '$end_date' OR status=$status";
  3.  

И что, каждый раз функцию писать ?


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
valenok
Отправлено: 26 Сентября, 2007 - 12:21:53
Post Id



Здесь могла бы быть ваша реклама


Покинул форум
Сообщений всего: 4574
Дата рег-ции: Июль 2006  
Откуда: Israel


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




Mario,
А смысл вот этого?

PHP:
скопировать код в буфер обмена
  1.  
  2.  function escape($text){
  3.       return  mysql_real_escape_string($text);
  4.  }
  5.  


-----
Truly yours, Sasha.
 
My status
 Top
EuGen Администратор
Отправлено: 26 Сентября, 2007 - 12:25:27
Post Id


Профессионал


Покинул форум
Сообщений всего: 9097
Дата рег-ции: Июнь 2007  
Откуда: Berlin


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




Не понял, зачем писать то, что уже есть в PHP??


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
valenok
Отправлено: 26 Сентября, 2007 - 12:26:40
Post Id



Здесь могла бы быть ваша реклама


Покинул форум
Сообщений всего: 4574
Дата рег-ции: Июль 2006  
Откуда: Israel


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




EuGen,
Это вопрос не тебе а автору


-----
Truly yours, Sasha.
 
My status
 Top
mario
Отправлено: 27 Сентября, 2007 - 09:50:21
Post Id



Новичок


Покинул форум
Сообщений всего: 6
Дата рег-ции: Апр. 2007  


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




2 valenok

Смысл тот же что и в твоём примере
CODE (php):
скопировать код в буфер обмена
  1.  
  2. $login = mysql_escape_string($_POST['login']);
  3. $pass = mysql_escape_string($_POST['pass']);
  4.  


CODE (php):
скопировать код в буфер обмена
  1.  
  2.   function escape($text){  
  3.        return  mysql_real_escape_string($text);  
  4.   }
  5. $login = escape($_POST['login']);
  6. $pass = escape($_POST['pass']);
  7.  


2 EuGen Ниндзя

CODE (php):
скопировать код в буфер обмена
  1.  
  2. $sql="SELECT * FROM users WHERE user_id IN (SELECT user_id FROM $rights_table) AND reg_date BETWEEN '$start_date' AND '$end_date' OR status=$status";
  3.  

Просто я не понимаю пока следующего:
reg_date BETWEEN '$start_date' AND '$end_date'
какую цель ты преследуеш этим, т.е. что тебе даёт "reg_date" между стартом и канцом?
Наверно для того чтобы считать это запросом авторизации
нужно знать $start_date и $end_date
И ещё вопрос почему в конце OR ? Если я правильно понял, ты хочеш получить ВСЕ ид юзеров, в которых указана reg_date или $status

Да и на втой вопрос про функции! Для канкретно этого запроса я не думаю что нужна какая либо функция


-----
ЗАНАЯ id МОЖНО МНОГО ЧТО УЗНАТЬ ;)
 
 Top
EuGen Администратор
Отправлено: 27 Сентября, 2007 - 10:18:40
Post Id


Профессионал


Покинул форум
Сообщений всего: 9097
Дата рег-ции: Июнь 2007  
Откуда: Berlin


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




Во-первых, это запрос - пример того, что подход с функцией лишней не есть гут.
P.S.
Он всего лишь делает следующее: выбирает пользователей, которые были зарегистрированы с..по, или же тех, чей статус нам важнее этих данных


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
mario
Отправлено: 27 Сентября, 2007 - 10:31:31
Post Id



Новичок


Покинул форум
Сообщений всего: 6
Дата рег-ции: Апр. 2007  


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




Я тебя понял, но как это относится к авторизации?

Я и не предлогаю тебе в этом запросе использовать функцию, только по тому, что код будет более громоздким, да это и лишне...

Могу наверно лишь посоветовать "mysql_free_result" если запрос возвращает большое количество данных Подмигивание


-----
ЗАНАЯ id МОЖНО МНОГО ЧТО УЗНАТЬ ;)
 
 Top
EuGen Администратор
Отправлено: 05 Октября, 2007 - 10:02:48
Post Id


Профессионал


Покинул форум
Сообщений всего: 9097
Дата рег-ции: Июнь 2007  
Откуда: Berlin


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




Дак какая разница? .. Ну, можете считать что я этот запрос просто так написал.. смысл в том, что не нужно переписывать то, что уже и так написано.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 1 (гостей: 1, зарегистрированных: 0)
« Обсуждение статей »


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



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

 
Powered by ExBB FM 1.0 RC1. InvisionExBB