CodeIgniter входная фильтрация

1

Я работаю над сайтом, перечисляющим книги, и столкнулся с проблемой фильтрации кода xignignign. Когда форма отправляется для создания листинга, любой заголовок, который включает в себя "Javascript:", заменяется на "[УДАЛЕНЫ]". Я попытался получить доступ к данным из массива POST следующим образом:

$title = $_POST['title'];

чтобы избежать использования класса Input, но он все равно каким-то образом фильтруется. Есть ли способ обойти это, что не связано с отключением global_xss_filtering?

Теги:
codeigniter
xss

1 ответ

8
Лучший ответ

Есть ли способ обойти это, не связанное с отключением global_xss_filtering?

Нет, извините. Вы должны отключить его, потому что он рано меняет исходные данные после выполнения CI.

Я мог бы на 5 страниц рассказать о правильном использовании фильтра xss, но я постараюсь сделать его кратким:

  • Выход фильтра, а не вход
  • Всегда держите контекст в уме и убегайте соответствующим образом (это текстовый файл HTML? SQL? javascript?)
  • Глобальный фильтр - это защитное одеяло. Вы можете удалить его, когда знаете, что делаете.

Вот только один из многих трагических примеров того, почему глобальный фильтр XSS - плохая идея:

  • Пользователь регистрируется для учетной записи и устанавливает пароль для document.write123
  • Вы обрабатываете пароль и завершаете хэширование строки [removed]123
  • Теперь пользователь может войти в систему с помощью любого из следующих паролей, потому что они также будут преобразованы в фильтр [removed]123 фильтром, прежде чем вы их подтвердите:

    • <script>123
    • document.write123
    • document.cookie123
    • и так далее...

Это не должно. Пользователь не должен иметь возможность входить в систему с несколькими паролями (если только это не по дизайну... я полагаю).

Кроме того, удачи, сохраняя любые ваши сообщения в блоге, которые используют <iframe> s... YouTube, например.

  • 1
    Можете ли вы объяснить, почему мы должны фильтровать вывод, а не ввод? Мне действительно интересно знать почему, потому что до сих пор я всегда фильтрую входные данные.
  • 3
    Поскольку выходные данные являются контекстно-зависимыми, и PHP не может выяснить, для чего используются данные - вы должны сказать ему, как избежать этого. Если вы фильтруете свои данные, вы портите исходные данные и не можете их восстановить. Если вы отфильтруете выходные данные, исходные данные останутся нетронутыми. Предположим, я хочу, чтобы пользователи публиковали примеры кода (как на этом сайте). Использование «тупого» глобального фильтра сделало бы это невозможным. Еще один побочный эффект, который вы можете получить, заключается в том, что вы начинаете неявно «доверять» всем пользовательским данным, что плохо. Кроме того, если XSS-фильтр улучшен, вы захотите воспользоваться им в своем выводе.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню