Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Защита от кодированного XSS


Автор: tolik777 13.6.2008, 09:55
Обнаружил на своем сайте XSS-уязвимость.
Есть поиск по сайту.
Код такой обработки данных:
Код

$search_word = mysql_real_escape_string($_REQUEST['search_string']);
.....далее SQL запрос к БД на предмет поиска этой строки
echo 'Вы искали: '.$search_word;
....далее вывод результатов

Проблема в том, что проходит код XSS типа http://*****.ru/search.php?search_string=%22%3E%3Ch1%3EX_S_S%3C/h1%3E%3Ca%20href=%22search.php?search_string=

Можно конечно поставить echo 'Вы искали: '.htmlspecialchars($search_word);
Но у меня там много вывода, да и хотелось бы сразу на входе защитить. На ум ничего больше не приходит, как вырезать все знаки % (т.к. в поисковом слове не используются), или ухищрения при помощи декодирования строки запроса.
Что посоветуете кроме как фильтровать на выходе при помощи htmlspecialchars???

Автор: Feldmarschall 13.6.2008, 10:04
Я бы порекомендовал приучать себя фильтровать на выходе.
Входов много, а выход - один. 

Автор: slaw 13.6.2008, 12:33
Цитата(Feldmarschall @  13.6.2008,  10:04 Найти цитируемый пост)
Я бы порекомендовал приучать себя фильтровать на выходе.Входов много, а выход - один. 

будем считать, что ты пошутил... до вывода серв ляжет при хорошем XSS


tolik777, убивай все спецсимволы, потому что помимо % есть еще варианты (или можешь экранировать их)


Цитата(tolik777 @  13.6.2008,  09:55 Найти цитируемый пост)
Можно конечно поставить echo 'Вы искали: '.htmlspecialchars($search_word);Но у меня там много вывода, да и хотелось бы сразу на входе защитить. На ум ничего больше не приходит, как вырезать все знаки % (т.к. в поисковом слове не используются), или ухищрения при помощи декодирования строки запроса.Что посоветуете кроме как фильтровать на выходе при помощи htmlspecialchars???

ты же вход защищаешь  smile  зачем вывод пускать через htmlspecialchars

Автор: tolik777 13.6.2008, 13:20
Цитата
ты же вход защищаешь    зачем вывод пускать через htmlspecialchars 

Именно поэтому и хочу на входе все отбросить. Тут просто на форуме в основном все предлагают при выводе ставить функцию htmlspecialchars, а про вход ничего нет.

Хмм, вроде бы strip_tags решает все проблемы. Что-то я про нее совсем забыл. 

Автор: Kallisto 13.6.2008, 13:47
Как вариант: 
foreach($_REQUEST as $key=>$value) $_REQUEST[$key] = addslashes(htmlspecialchars($value));
smile

Автор: Feldmarschall 13.6.2008, 13:49
хехе.
приятно послушать беседу настоящих специалистов.
можно я со своими дурацкими вопросами?

Цитата(slaw @  13.6.2008,  12:33 Найти цитируемый пост)
до вывода серв ляжет при хорошем XSS

Не могли бы вы пояснить механизм этого "укладывания"?

Цитата(slaw @  13.6.2008,  12:33 Найти цитируемый пост)
ты же вход защищаешь 

Цитата(tolik777 @  13.6.2008,  13:20 Найти цитируемый пост)
а про вход ничего нет.

Если кто-нибудь из вас объяснит механизм действия XSS на входе, а не а выходе, то на форуме тут же что-нибудь появится на эжту тему. 

Цитата(tolik777 @  13.6.2008,  13:20 Найти цитируемый пост)
вроде бы strip_tags решает все проблемы. 

гениальное решение. а в чем его принципиальное отличие от htmlspecialchars?

Автор: tolik777 13.6.2008, 14:28
да чо-то я ступил, от супрастина вообще торможу. воспрос закрыт

Автор: tolik777 13.6.2008, 21:34
Еще один вопрос. Сделал функцию фильтрации, но не могу понять почему у меня если использовать htmlentities, а затем mysql_real_escape_string к русским словам добавляется \0?
К примеру следующий код:
Код

$search_string = "тест";
echo strlen($search_string)."<BR>";
$search_string = htmlentities($search_string,ENT_QUOTES,"UTF-8");        // мнемонизировали строку.
echo strlen($search_string)."<BR>";
$search_string = mysql_real_escape_string($search_string);
echo strlen($search_string)."<BR>";
echo 'Вы искали: '.$search_string;


Выдает:
4
5
6
Вы искали: тест\0 

Автор: tolik777 14.6.2008, 08:56
Если заменить htmlentities на htmlspecialchars, то все ок, символы не добавляются.

Автор: Feldmarschall 14.6.2008, 11:16
результат работы mysql_real_escape_string тебя вообще не должен волновать
и уж тем более, результату работы этой функции нечего делать на экране

Автор: SelenIT 28.9.2008, 13:25
Цитата

Как защититься на "входе"?

Самый надежный вариант:
Код

if (preg_match("/[^\w ]/", $search_string)) // если в декодированном поисковом запросе есть что-то, 
                               // кроме букв, цифр, подчеркиваний и пробелов - 
                               // считаем, что нас ломают. А с хакерами у нас разговор короткий ;)
{
    header ("404 Not Found");
    die ("Иди RTFM, кулхацкер юный! :))))))))))))))")
}


А вообще
Цитата(tolik777 @  13.6.2008,  09:55 Найти цитируемый пост)
echo 'Вы искали: '.htmlspecialchars($search_word);

самый стандартный, логичный и правильный вариант.

Автор: nerezus 28.9.2008, 17:39
Цитата

и хотелось бы сразу на входе защитить. 
 Не правильно.
Защищать ничего не надо.

Нужно просто подготавливать данные для вывода при выводе.

Советую использовать PHP/Smarty/etc шаблонизатор

Добавлено через 2 минуты и 11 секунд
Цитата

будем считать, что ты пошутил... до вывода серв ляжет при хорошем XSS
 Он не пошутил.

Цитата

Самый надежный вариант:
 А смысл. Вариант гораздо лучше ты написал ниже.
 
Цитата

самый стандартный, логичный и правильный вариант.
 +1.

Автор: lukas 29.9.2008, 08:29
Цитата(tolik777 @  13.6.2008,  09:55 Найти цитируемый пост)
Можно конечно поставить echo 'Вы искали: '.htmlspecialchars($search_word);
Но у меня там много вывода, да и хотелось бы сразу на входе защитить. На ум ничего больше не приходит, как вырезать все знаки % (т.к. в поисковом слове не используются), или ухищрения при помощи декодирования строки запроса.


я не понял что значит у меня много вывода???, в чем проблема...

Автор: MoLeX 29.9.2008, 08:49
дату темы смотели?!) автор уже наверное решил проблему)

Автор: SelenIT 29.9.2008, 11:47
MoLeX, я специально поднял, в связи с недавно всплывавшим похожим вопросом. Чтобы закрыть ее на правильной ноте. А то порядком поднадоели эти регулярные попытки изобрести "лекарство от XSS на входе"... ;)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)