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 :: Класс фильтрации GET POST COOKIE запросов

 PHP.SU

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


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

> Описание: PHP-класс фильтрации входящих GPC-данных с поддержкой JSON массивов
Haron
Отправлено: 12 Апреля, 2011 - 16:38:12
Post Id



Частый гость


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


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




Класс реализует фильтрацию данных $_GET, $_POST и $_COOKIE. Также умеет фильтровать JSON-массивы.

Класс заточен под юникод.

Зойчем нужен этот класс?
Класс фильтрует GET POST и COOKIE запросы от "вредных" вещей. В частности - поможет защитить сайт от XSS-атак (Вставки кода в страницу). Подробнее по XSS - здесь: http://ru[dot]wikipedia[dot]org/wiki/xss

Чтобы защититься, достаточно НЕ использовать входные GPC-запросы напрямую (никогда не доверяйте пользователям), а получать их через этот класс как описано в примере.

Обратите внимание, данный скрипт - НЕ защитит от атак типа SQL-injection, ибо там есть свои заморочки, и их я здесь не рассматриваю.

Для работы необходимо наличие расширения mbstring на сервере.

PHP:
скопировать код в буфер обмена
  1.  
  2. /****************KILLER**************\
  3. |*              "'';!--\"<XSS>=&{()}"           *|
  4. \************************************/
  5. class gpc
  6. {
  7.         public $get_data        = array();
  8.         public $post_data       = array();
  9.         public $cook_data       = array();
  10.  
  11.         public $encoding        = 'UTF-8';
  12.  
  13.         function __construct()
  14.         {
  15.                 $this -> get_data = $this -> filter_vars($_GET, 'get');
  16.                 $this -> post_data = $this -> filter_vars($_POST, 'post');
  17.                 $this -> cook_data = $this -> filter_vars($_COOKIE, 'cookie');
  18.         }
  19.        
  20.         public static function __data_clean($input)
  21.         {
  22.                 $input = @mb_convert_encoding(urldecode($input), $this -> encoding, mb_detect_encoding($input));
  23.                 return strip_tags(htmlentities($input, ENT_QUOTES, $this -> encoding));
  24.         }
  25.        
  26.         private function filter_vars($input)
  27.         {
  28.                 foreach ($input as $k => &$v)
  29.                 {
  30.                         if (is_array($v))
  31.                         {
  32.                                 $v = $this -> filter_vars($v);
  33.                         }
  34.                         else
  35.                         {
  36.                                 $v = self::__data_clean($v);
  37.                         }
  38.                         unset($v);
  39.                 }
  40.                 return $input;
  41.         }
  42. }
  43.  


Пример использования:
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. // Файл: test.php
  3. // Создаём экземпляр класса:
  4. $requests = new GPC;
  5. ?>
  6. <form method="post" action="test.php">
  7.     <input type="text" value="">
  8.     <input type="submit" value="Послать">
  9. </form>
  10. <?PHP
  11. if (isset($requests -> post_data['submit']))
  12. {
  13.     echo $requests -> post_data['text'];
  14. }
  15. ?>

(Отредактировано автором: 26 Октября, 2012 - 15:12:29)



-----
И чё?
 
 Top
ALEN Модератор
Отправлено: 13 Апреля, 2011 - 10:54:31
Post Id



Участник


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


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




Примеры использования было бы хорошо выложить.
 
 Top
Haron
Отправлено: 14 Апреля, 2011 - 07:18:58
Post Id



Частый гость


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


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




Дописал в пост.


-----
И чё?
 
 Top
ALEN Модератор
Отправлено: 14 Апреля, 2011 - 13:00:44
Post Id



Участник


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


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




Написал бы, какие преимущества использования класса. Не забывай читают информацию люди, которые сами не особо разбираются в php и не имеют достаточных знаний, чтоб писать классы.
 
 Top
OrmaJever
Отправлено: 14 Апреля, 2011 - 13:59:32
Post Id



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


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


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




Я таки не понял смысл метода init ? Разве просто бъект создать нельзя?


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
Haron
Отправлено: 25 Апреля, 2011 - 06:46:47
Post Id



Частый гость


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


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




OrmaJever пишет:
Я таки не понял смысл метода init ? Разве просто бъект создать нельзя?


Функция создаёт статический экземпляр объекта (ООП паттерн Singletone). Можно юзать по желанию, а можно и тупо создать объект.

Примеры:
PHP:
скопировать код в буфер обмена
  1. $requests = new GPC; // Просто создаём новый экземпляр класса.
  2. $requests = GPC::init() // Создаём "синглтон".


Подробнее: http://ru[dot]wikipedia[dot]org/wiki/Singleton

(Отредактировано автором: 25 Апреля, 2011 - 06:53:41)



-----
И чё?
 
 Top
Haron
Отправлено: 09 Июня, 2011 - 00:53:36
Post Id



Частый гость


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


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




Внесены некоторые исправления:

- "Кривоватое" регулярное выражение определяющее кодировку (обнаружились проблемы с длинными строками) - заменено на mb_detect_encoding().
- Доработана функция __data_process(), теперь корректно обрабатывает вложенные массивы POST (например из полей типа <select>).


-----
И чё?
 
 Top
EuGen Администратор
Отправлено: 09 Июня, 2011 - 09:27:38
Post Id


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


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


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




0. init() лучше переименовать в что-то подобное getInstance() так как это все же в чистом виде получение одного экземпляра
1. Почему было решено использовать синглтон? В ряде случаев это - антипаттерн. И в данном случае, так как Вы используете один экземпляр, то все его свойства будут каждый раз накапливаться или перезаписываться. При обработке данных из нескольких форм это может быть очень неудобно/неочевидно.
2.
Haron пишет:
#
/**
* Array filtering function
* @param GPC array $input
* @return clean array
*/

И в то же время
Haron пишет:
if (count($input) === 0) return false;

То есть массив будет возвращен не всегда. Лучше это учитывать.
Аналогично с
Haron пишет:
filter_json_array


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



Частый гость


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


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




- Класс тотально упрощён и облегчен.
- Добавлена поддержка реквестов с неограниченной вложенность.
- Работает на php 5.4

Вместо рекурсии в методе filter_vars - можно было бы использовать функцию array_walk_recursive(), но к сожалению, в php 5.4 эта функция стала во многом бесполезной. В частности - она больше не может изменять перебираемый массив "на лету".


-----
И чё?
 
 Top
avtor.fox
Отправлено: 26 Октября, 2012 - 17:08:34
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2083
Дата рег-ции: Март 2012  
Откуда: Воронеж


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




Haron
По мойму ничего интересного в данном классе нет.


В моё случае при отправке пост данных подгружается класс 'data', смотрит с какой страницы пришли, фильтрует данные и вызывает определённые методы другого класса, которые в свою очередь работают с отфильтрованными данными. Ну это так, к слову Закатив глазки
Просто я бы не нашёл применение этому классу. Но класс хороший Улыбка
 
 Top
Haron
Отправлено: 29 Октября, 2012 - 03:26:18
Post Id



Частый гость


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


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




Значит тебе он не нужен, проходи мимо Улыбка


-----
И чё?
 
 Top
DeepVarvar Супермодератор
Отправлено: 29 Октября, 2012 - 03:41:19
Post Id



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


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


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




Haron:
1) Если будут ломать и подменят заголовки - определение кодировки отвалится.
2) Если отправят смешанную кодировку - ее определение отвалится. Вобщем нужно сделать сперва проверку, и если что-то не так - бросить эксепшн.
3) Главный вопрос - как быть с ЦК-эдитором и иже с ними? Стрипать теги уже нельзя, а чистить надо.
 
 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