CodeIgniter – зачем использовать xss_clean

если я дезинфицирую свои вставки в БД, а также htmlentities($text, ENT_COMPAT, 'UTF-8') HTML, я пишу htmlentities($text, ENT_COMPAT, 'UTF-8') – есть ли смысл фильтровать входы с помощью xss_clean? Какие еще преимущества он дает?

xss_clean () является обширным, а также глупым. 90% этой функции ничего не делает для предотвращения xss. Например, поиск слова alert но не document.cookie . Ни один хакер не собирается использовать alert в своем эксплоите, они собираются захватить файл cookie с помощью xss или прочитать токен CSRF для создания XHR.

Однако использование htmlentities() или htmlspecialchars() с ним является избыточным. Случай, когда xss_clean() исправляет проблему, и htmlentities($text, ENT_COMPAT, 'UTF-8') завершается с ошибкой:

 <?php print "<img src='$var'>"; ?> 

Простой пример:

http: //localhost/xss.php? var = http: //domain/some_image.gif '% 20onload = alert (/ xss /)

Это добавит обработчик onload= event к тегу изображения. Метод stoppipng этой формы xss – htmlspecialchars($var,ENT_QUOTES); или в этом случае xss_clean() также предотвратит это.

Однако, ссылаясь на документацию xss_clean ():

Разумеется, ничто никогда не бывает на 100% надежным, но я не смог получить что-либо, прошедшее через фильтр.

При этом XSS является output problem не input problem . Например, эта функция не может учитывать, что переменная уже находится в <script> или обработчике событий. Он также не останавливает DOM на основе XSS. Вы должны учитывать, как вы используете данные , чтобы использовать лучшую функцию. Фильтрация всех данных на входе является плохой практикой . Это не только небезопасно, но и искажает данные, которые могут затруднить сравнение.

В вашем случае «более строгие методы являются точными и более легкими» . Разработчики CodeIgniter намереваются использовать xss_clean () для другого варианта использования «система комментариев или форум, который позволяет« безопасные »теги HTML». Это не ясно из документации, где xss_clean отображается в поле имени пользователя.

Есть еще одна причина, по которой никогда не использовать xss_clean (), который пока не был выделен в stackoverflow. xss_clean () был нарушен в течение 2011 и 2012 годов , и его невозможно полностью исправить. По крайней мере, без полной реорганизации, чего не было. На данный момент он по-прежнему уязвим для таких строк:

 <a href="j&#x26;#x41;vascript:alert%252831337%2529">Hello</a> 

Текущая реализация xss_clean () начинается с эффективного применения urldecode () и html_entity_decode () ко всей строке. Это необходимо, чтобы использовать наивную проверку для таких вещей, как «javascript:». В конце он возвращает декодированную строку .

Злоумышленник может просто дважды закодировать свой эксплоит. Он будет декодирован один раз xss_clean () и пройдет как чистый. Затем у вас есть однократно закодированный эксплойт, готовый к исполнению в браузере.

Я называю эти проверки «наивными» и нефиксируемыми, потому что они в значительной степени зависят от регулярных выражений. HTML не является обычным языком. Вам нужен более мощный синтаксический анализатор, соответствующий тому, который находится в браузере ; xss_clean () не имеет ничего подобного. Возможно, есть белый список подмножества HTML, который лексически чист с регулярными выражениями. Однако текущий xss_clean () – очень черный список.

Да, вы все равно должны использовать его, я обычно делаю это правило, чтобы использовать его, по крайней мере, для входа в открытый доступ, что означает любой вход, который любой может получить и отправить.

Как правило, дезинфекция входных данных для запросов БД кажется побочным эффектом, поскольку истинная цель этой функции – предотвращать атаки на сценарии межсайтового сценария .

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

Я бы рекомендовал использовать http://htmlpurifier.org/ для очистки XSS. Я работаю над расширением класса ввода CodeIgniter, чтобы начать использовать его.

Если вы хотите, чтобы фильтр запускался автоматически каждый раз, когда он встречает данные POST или COOKIE, вы можете включить его, открыв файл application / config / config.php и установив это: $ config ['global_xss_filtering'] = TRUE;

Вы можете включить защиту csrf, открыв файл application / config / config.php и установив это: $ config ['csrf_protection'] = TRUE;

более подробную информацию см. по следующей ссылке.

https://ellislab.com/codeigniter/user-guide/libraries/security.html