Неправильная xss фильтрация

Нашли ошибку в CI? — пишем сюда!

Неправильная xss фильтрация

Сообщение denis909 » 05 апр 2009, 20:04

В конфиге:

Код: Выделить всё
$config['global_xss_filtering'] = true;

В форме, заменяет символы %ba%, %base%, %base_url% и т.д. на непонятное є%, это видно уже в $_POST массиве (т.е. form_validation тут не при чем, как я подумал сначала).

Ваше мнение, это баг или фича?
Аватара пользователя
denis909
 
Сообщения: 185
Зарегистрирован: 27 фев 2009, 00:58

Re: Неправильная xss фильтрация

Сообщение Big_Shark » 06 апр 2009, 01:38

По моему баг.
Приведи привет плиз как заполняеш форму саму форму и что выдается если сделать var_dump($_POST);
Отвечу на ваши вопросы по CodeIgniter и Kohana3
Благодарности принимаются тут: 41001216991355 (ЯД)
Big_Shark
Модератор
 
Сообщения: 1307
Зарегистрирован: 03 фев 2009, 02:12
Откуда: Владивосток

Re: Неправильная xss фильтрация

Сообщение Master » 06 апр 2009, 07:42

А должно заменять?

В принципе не удивлюсь наличию багов. Я в 1.6.1 кучу функций сам дописывал, uri хелпер исправлял, потому что логика работы была кое-где нарушена, ну или не совсем мне понятна. Вообще там есть странности. Например, отключенные по умолчанию переменные $_GET.
Master
 
Сообщения: 230
Зарегистрирован: 13 мар 2009, 13:22

Re: Неправильная xss фильтрация

Сообщение denis909 » 06 апр 2009, 11:34

Мое мнение что заменять не должно, т.к. это не xss атака. Проверить можно гораздо проще, без дампов и т.п. Включите в конфиге опцию для xss (в любом проекте на CI) и попробуйте добавить текст %base% в любое поле (где такой текст не запрещен валидацией). Если на странице появится %base% - значит проблема только у меня, а если нет, то..?
Аватара пользователя
denis909
 
Сообщения: 185
Зарегистрирован: 27 фев 2009, 00:58

Re: Неправильная xss фильтрация

Сообщение Master » 06 апр 2009, 13:44

Видишь ли, Денис, я привык работать с пхп так: если скрипт ведёт себя неожиданно, я смотрю исходники и разбираюсь в чём причина, при необходимости модифицирую. Тут же, на этом форуме, 2/3 вопросов задаются с позиции, будто фреймворк - это чёрный ящик. Это не так. Вот функция, отвечающая за xss очистку (/system/libraries/Input.php)
Код: Выделить всё
function xss_clean($str){
      
      $str = preg_replace('/\0+/', '', $str);
      $str = preg_replace('/(\\\\0)+/', '', $str);

      $str = preg_replace('#(&\#?[0-9a-z]+)[\x00-\x20]*;?#i', "\\1;", $str);
      
      $str = preg_replace('#(&\#x?)([0-9A-F]+);?#i',"\\1\\2;",$str);

      $str = rawurldecode($str);
      
      $str = preg_replace_callback("/[a-z]+=([\'\"]).*?\\1/si", array($this, '_attribute_conversion'), $str);
      
      $str = preg_replace_callback("/<([\w]+)[^>]*>/si", array($this, '_html_entity_decode_callback'), $str);

      $str = str_replace("\t", " ", $str);

      $bad = array(
                  'document.cookie'   => '[removed]',
                  'document.write'   => '[removed]',
                  '.parentNode'      => '[removed]',
                  '.innerHTML'      => '[removed]',
                  'window.location'   => '[removed]',
                  '-moz-binding'      => '[removed]',
                  '<!--'            => '&lt;!--',
                  '-->'            => '--&gt;',
                  '<!CDATA['         => '&lt;![CDATA['
               );

      foreach ($bad as $key => $val)
      {
         $str = str_replace($key, $val, $str);   
      }

      $bad = array(
                  "javascript\s*:"   => '[removed]',
                  "expression\s*\("   => '[removed]', // CSS and IE
                  "Redirect\s+302"   => '[removed]'
               );
               
      foreach ($bad as $key => $val)
      {
         $str = preg_replace("#".$key."#i", $val, $str);   
      }
   
      $str = str_replace(array('<?php', '<?PHP', '<?', '?'.'>'),  array('&lt;?php', '&lt;?PHP', '&lt;?', '?&gt;'), $str);
   
      $words = array('javascript', 'expression', 'vbscript', 'script', 'applet', 'alert', 'document', 'write', 'cookie', 'window');
      foreach ($words as $word)
      {
         $temp = '';
         for ($i = 0; $i < strlen($word); $i++)
         {
            $temp .= substr($word, $i, 1)."\s*";
         }
         
         $str = preg_replace('#('.substr($temp, 0, -3).')(\W)#ise', "preg_replace('/\s+/s', '', '\\1').'\\2'", $str);
      }
   
      do
      {
         $original = $str;
         
         if ((version_compare(PHP_VERSION, '5.0', '>=') === TRUE && stripos($str, '</a>') !== FALSE) OR
             preg_match("/<\/a>/i", $str))
         {
            $str = preg_replace_callback("#<a.*?</a>#si", array($this, '_js_link_removal'), $str);
         }
         
         if ((version_compare(PHP_VERSION, '5.0', '>=') === TRUE && stripos($str, '<img') !== FALSE) OR
             preg_match("/img/i", $str))
         {
            $str = preg_replace_callback("#<img.*?".">#si", array($this, '_js_img_removal'), $str);
         }
         
         if ((version_compare(PHP_VERSION, '5.0', '>=') === TRUE && (stripos($str, 'script') !== FALSE OR stripos($str, 'xss') !== FALSE)) OR
             preg_match("/(script|xss)/i", $str))
         {
            $str = preg_replace("#</*(script|xss).*?\>#si", "", $str);
         }
      }
      while($original != $str);
      
      unset($original);

      $event_handlers = array('onblur','onchange','onclick','onfocus','onload','onmouseover','onmouseup','onmousedown','onselect','onsubmit','onunload','onkeypress','onkeydown','onkeyup','onresize', 'xmlns');
      $str = preg_replace("#<([^>]+)(".implode('|', $event_handlers).")([^>]*)>#iU", "&lt;\\1\\2\\3&gt;", $str);
   
      $str = preg_replace('#<(/*\s*)(alert|applet|basefont|base|behavior|bgsound|blink|body|embed|expression|form|frameset|frame|head|html|ilayer|iframe|input|layer|link|meta|object|plaintext|style|script|textarea|title|xml|xss)([^>]*)>#is', "&lt;\\1\\2\\3&gt;", $str);
      
      $str = preg_replace('#(alert|cmd|passthru|eval|exec|expression|system|fopen|fsockopen|file|file_get_contents|readfile|unlink)(\s*)\((.*?)\)#si', "\\1\\2&#40;\\3&#41;", $str);
                  
      $bad = array(
                  'document.cookie'   => '[removed]',
                  'document.write'   => '[removed]',
                  '.parentNode'      => '[removed]',
                  '.innerHTML'      => '[removed]',
                  'window.location'   => '[removed]',
                  '-moz-binding'      => '[removed]',
                  '<!--'            => '&lt;!--',
                  '-->'            => '--&gt;',
                  '<!CDATA['         => '&lt;![CDATA['
               );

      foreach ($bad as $key => $val)
      {
         $str = str_replace($key, $val, $str);   
      }

      $bad = array(
                  "javascript\s*:"   => '[removed]',
                  "expression\s*\("   => '[removed]', // CSS and IE
                  "Redirect\s+302"   => '[removed]'
               );
               
      foreach ($bad as $key => $val)
      {
         $str = preg_replace("#".$key."#i", $val, $str);   
      }
      
                  
      log_message('debug', "XSS Filtering completed");
      return $str;
}

(комментарии я потёр)
прогони её через дебаггер и увидишь в какой строчке портятся данные. Если надо - поправь её.
Master
 
Сообщения: 230
Зарегистрирован: 13 мар 2009, 13:22

Re: Неправильная xss фильтрация

Сообщение Master » 06 апр 2009, 13:46

Кстати, что за приложение такое ты пишешь, что тебе нужна xss-очистка?
Master
 
Сообщения: 230
Зарегистрирован: 13 мар 2009, 13:22

Re: Неправильная xss фильтрация

Сообщение denis909 » 06 апр 2009, 14:50

Спасибо конечно за помощь, но CI для меня не черный ящик. В данном случае, для меня лично, не важна ни причина, ни возможные пути решения. Если это баг, то о нем должны знать. Давайте определим, баг это или нет, и если баг - то напишем багрепорт разработчикам. Возможно, сразу приложим свои пути решения, но ведь это уже вторично...

Из ответа, я так и не понял, это у меня руки кривые, т.е. такие проблемы с xss только у меня, и вы помогаете их решить, или это проблема общая (баг), но решить ее должен именно я, и приложенный код призван мне в этом помочь?
Аватара пользователя
denis909
 
Сообщения: 185
Зарегистрирован: 27 фев 2009, 00:58

Re: Неправильная xss фильтрация

Сообщение Sam Dark » 06 апр 2009, 15:22

Кстати, что за приложение такое ты пишешь, что тебе нужна xss-очистка?

Любое, где пользователи вводят данные.
Аватара пользователя
Sam Dark
 
Сообщения: 824
Зарегистрирован: 16 апр 2008, 19:23
Откуда: Воронеж

Re: Неправильная xss фильтрация

Сообщение Master » 06 апр 2009, 18:31

ах да, чёрт возьми, это же баг-репорт раздел :lol:
Не знаю, xss-фильтрацией не пользуюсь

Sam Dark, написал хренову тучу сайтов и нигде xss-фильтрацию не делал. по-моему от неё только вред
Master
 
Сообщения: 230
Зарегистрирован: 13 мар 2009, 13:22

Re: Неправильная xss фильтрация

Сообщение Sam Dark » 06 апр 2009, 19:57

Вред от неё пока на сайте никто из анонимных пользователей ничего не вводит.
Аватара пользователя
Sam Dark
 
Сообщения: 824
Зарегистрирован: 16 апр 2008, 19:23
Откуда: Воронеж

Re: Неправильная xss фильтрация

Сообщение Master » 08 апр 2009, 07:30

дело не в том, кто что вводит, а в том, как это потом отображается
Master
 
Сообщения: 230
Зарегистрирован: 13 мар 2009, 13:22

Re: Неправильная xss фильтрация

Сообщение Sam Dark » 08 апр 2009, 10:52

Ну, лучше фильтровать один раз при вводе, чем каждый раз при отображении.
Аватара пользователя
Sam Dark
 
Сообщения: 824
Зарегистрирован: 16 апр 2008, 19:23
Откуда: Воронеж


Вернуться в Баг-репорты

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и гости: 0