Codeigniter HTML к вопросу базы данных - PullRequest
2 голосов
/ 11 июня 2011

Я работаю над веб-сайтом, который позволяет пользователям отправлять сообщения в блоге, однако, похоже, что есть небольшая проблема. Я использую global_xss_filtering (TRUE), поэтому все будет отфильтровано.

Но когда я использую xss_filtering теги HTML типа <strong> и т. Д. Удаляются. Если я установлю global_xss_filtering на FALSE, все будет отлично.

Но как я могу заставить это работать с global_xss_filtering, установленным на TRUE и одновременно защищенным? Какие-либо предложения?

Ответы [ 3 ]

2 голосов
/ 11 июня 2011

Проблема заключается в следующем:

При включенном глобальном xss_clean все данные $_GET, $_POST и $_COOKIE очищаются конструктором класса Input с помощью _sanitize_globals().

Это происходит слишком рано при выполнении CI, чтобы вы что-то предприняли позже. Как только данные были xss_cleaned, их невозможно очистить.

У вас есть два варианта:

  • Использовать предварительную систему крючок
  • Отключить глобальный xss_clean

У меня нет никаких советов по использованию ловушки для этого, но я рекомендую просто отключить глобальный xss_clean по нескольким причинам:

  • Очевидно: это не изменит данные, и поставит вас под контроль, поощряя вас помнить о том, когда и где на самом деле могут происходить атаки XSS.

  • Функция xss_clean довольно тяжелая и агрессивная, и в большинстве случаев она вам не нужна. Запуск его в каждый элемент post, get и cookie сокращает время выполнения.

  • Довольно просто добавить xss_clean в качестве правила проверки формы или использовать $this->security->xss_clean()

  • В качестве лучшей практики все равно следует дезинфицировать свои данные и вывод HTML, вместо того чтобы доверять глобальному фильтру и забывать об этом.

Мне нужно было разрешить, например, <script> теги для CMS, и отключение глобального фильтра было единственным способом их пропустить. Это большое изменение и может заставить вас нервничать, но, к сожалению, это единственный способ (если вы не можете понять, как написать хук, который поможет).

Как уже упоминалось в комментариях, он не должен фильтровать <strong> теги ...

0 голосов
/ 11 июня 2011

Короткая версия: Вы не можете.

Длинная версия: фильтрация HTML для удаления злых вещей - дело сложное. Недостаточно занести в черный список типы тегов, чтобы предотвратить такие теги, как script или frame, потому что HTML постоянно меняется. Даже если вы отслеживали все новые типы тегов, злоумышленники могут присоединить Javascript к вызовам image onload . Даже если вам удалось отфильтровать все атрибуты тегов, которые вызывают Javascript, без удаления полезных вещей, таких как src или href или height (что почти невозможно, потому что их миллиард), вы все равно не защищены. Вы не можете быть уверены, что каждый браузер правильно реализует каждый тег. Кроме того, вы не можете быть уверены, что текущие реализации никогда не изменятся. Могут быть добавлены новые ошибки.

Поверьте мне, используя что-то вроде markdown или rst или BBCode в тысячу раз легче защитить.

0 голосов
/ 11 июня 2011

Перед применением проверки XSS вы можете выполнить htmlentities (), а затем, когда вы получите его из базы данных, вы можете выполнить html_entity_decode ().

...