2012-03-12 5 views
1

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

$title = $_POST['title']; 

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

+0

Этот ответ может помочь вам: http://stackoverflow.com/a/3905208/1220835 – Basti

ответ

8

Есть ли какой-либо путь вокруг этого, который не включает поворот global_xss_filtering?

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

я мог разглагольствовать на 5 страницах по поводу надлежащего использования XSS-фильтр, но я буду стараться и держать его кратким:

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

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

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

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

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

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

+1

Можете ли вы объяснить, почему мы должны фильтровать выход, а не вход? Мне действительно интересно узнать, почему, потому что до сих пор я всегда фильтровал входные данные. –

+2

Поскольку вывод чувствителен к контексту, а PHP не может понять, для чего используются данные, вы должны сказать ему, как правильно сбежать. Если вы фильтруете свой ввод, вы испортите исходные данные и не сможете его восстановить.Если вы фильтруете выход, исходные данные остаются нетронутыми. Предположим, я хочу, чтобы пользователи отправляли образцы кода (например, на этом сайте). Использование «немого» глобального фильтра сделает это невозможным. Другой побочный эффект, который может возникнуть, заключается в том, что вы начинаете «доверять» всем пользовательским данным неявно, что плохо. Кроме того, если фильтр XSS будет улучшен, вы бы хотели воспользоваться этим, на своем выходе. –

+0

Кроме того, глобальный фильтр XSS работает на * all * get, post и cookie данных, на * каждый * запрос, и это довольно медленно, а иногда и даже глупо. Например, удаление таких вещей, как '' и' alert() ', которые никогда не беспокоило бы любого реального хакера. Конечно, эти вещи могут быть разрушительными, но это не проблема XSS. –

Смежные вопросы