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

Добавлено:
05 апр 2009, 20:04
denis909
В конфиге:
- Код: Выделить всё
$config['global_xss_filtering'] = true;
В форме, заменяет символы %ba%, %base%, %base_url% и т.д. на непонятное є%, это видно уже в $_POST массиве (т.е. form_validation тут не при чем, как я подумал сначала).
Ваше мнение, это баг или фича?
Re: Неправильная xss фильтрация

Добавлено:
06 апр 2009, 01:38
Big_Shark
По моему баг.
Приведи привет плиз как заполняеш форму саму форму и что выдается если сделать var_dump($_POST);
Re: Неправильная xss фильтрация

Добавлено:
06 апр 2009, 07:42
Master
А должно заменять?
В принципе не удивлюсь наличию багов. Я в 1.6.1 кучу функций сам дописывал, uri хелпер исправлял, потому что логика работы была кое-где нарушена, ну или не совсем мне понятна. Вообще там есть странности. Например, отключенные по умолчанию переменные $_GET.
Re: Неправильная xss фильтрация

Добавлено:
06 апр 2009, 11:34
denis909
Мое мнение что заменять не должно, т.к. это не xss атака. Проверить можно гораздо проще, без дампов и т.п. Включите в конфиге опцию для xss (в любом проекте на CI) и попробуйте добавить текст %base% в любое поле (где такой текст не запрещен валидацией). Если на странице появится %base% - значит проблема только у меня, а если нет, то..?
Re: Неправильная xss фильтрация

Добавлено:
06 апр 2009, 13:44
Master
Видишь ли, Денис, я привык работать с пхп так: если скрипт ведёт себя неожиданно, я смотрю исходники и разбираюсь в чём причина, при необходимости модифицирую. Тут же, на этом форуме, 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]',
'<!--' => '<!--',
'-->' => '-->',
'<!CDATA[' => '<![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('<?php', '<?PHP', '<?', '?>'), $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", "<\\1\\2\\3>", $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', "<\\1\\2\\3>", $str);
$str = preg_replace('#(alert|cmd|passthru|eval|exec|expression|system|fopen|fsockopen|file|file_get_contents|readfile|unlink)(\s*)\((.*?)\)#si', "\\1\\2(\\3)", $str);
$bad = array(
'document.cookie' => '[removed]',
'document.write' => '[removed]',
'.parentNode' => '[removed]',
'.innerHTML' => '[removed]',
'window.location' => '[removed]',
'-moz-binding' => '[removed]',
'<!--' => '<!--',
'-->' => '-->',
'<!CDATA[' => '<![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;
}
(комментарии я потёр)
прогони её через дебаггер и увидишь в какой строчке портятся данные. Если надо - поправь её.
Re: Неправильная xss фильтрация

Добавлено:
06 апр 2009, 13:46
Master
Кстати, что за приложение такое ты пишешь, что тебе нужна xss-очистка?
Re: Неправильная xss фильтрация

Добавлено:
06 апр 2009, 14:50
denis909
Спасибо конечно за помощь, но CI для меня не черный ящик. В данном случае, для меня лично, не важна ни причина, ни возможные пути решения. Если это баг, то о нем должны знать. Давайте определим, баг это или нет, и если баг - то напишем багрепорт разработчикам. Возможно, сразу приложим свои пути решения, но ведь это уже вторично...
Из ответа, я так и не понял, это у меня руки кривые, т.е. такие проблемы с xss только у меня, и вы помогаете их решить, или это проблема общая (баг), но решить ее должен именно я, и приложенный код призван мне в этом помочь?
Re: Неправильная xss фильтрация

Добавлено:
06 апр 2009, 15:22
Sam Dark
Кстати, что за приложение такое ты пишешь, что тебе нужна xss-очистка?
Любое, где пользователи вводят данные.
Re: Неправильная xss фильтрация

Добавлено:
06 апр 2009, 18:31
Master
ах да, чёрт возьми, это же баг-репорт раздел
Не знаю, xss-фильтрацией не пользуюсь
Sam Dark, написал хренову тучу сайтов и нигде xss-фильтрацию не делал. по-моему от неё только вред
Re: Неправильная xss фильтрация

Добавлено:
06 апр 2009, 19:57
Sam Dark
Вред от неё пока на сайте никто из анонимных пользователей ничего не вводит.
Re: Неправильная xss фильтрация

Добавлено:
08 апр 2009, 07:30
Master
дело не в том, кто что вводит, а в том, как это потом отображается
Re: Неправильная xss фильтрация

Добавлено:
08 апр 2009, 10:52
Sam Dark
Ну, лучше фильтровать один раз при вводе, чем каждый раз при отображении.