Насколько хорош метод Rails sanitize()?
Можно ли использовать ActionView:: Helpers:: SanitizeHelper # sanitize по введенному пользователем тексту, который я планирую показывать другим пользователям? Например, правильно ли будет обрабатывать все случаи, описанные на этом сайте?
Кроме того, в документации упоминаются:
Обратите внимание, что санировка предоставленный пользователем текст не гарантирует что полученная разметка действительна (в соответствии с типом документа) или даже хорошо сформированный. Выход может все же содержат, например, unescaped <, > , & символов и запутанных браузеров.
Какой лучший способ справиться с этим? Передайте дезинфицированный текст через Hpricot
перед отображением?
Ответы
Ответ 1
Ryan Grove Sanitize идет намного дальше, чем Rails 3 sanitize
. Он гарантирует, что выходной HTML хорошо сформирован и имеет три встроенных белых списка:
Sanitize:: Config:: RESTRICTED
Позволяет только очень простую встроенную разметку форматирования. Нет ссылок, изображений или элементов блока.
дезинфицировать:: Config:: BASIC
Позволяет различную разметку, включая теги, ссылки и списки форматирования. Изображения и таблицы не разрешены, ссылки ограничены протоколами FTP, HTTP, HTTPS и mailto, а атрибут добавляется ко всем ссылкам для смягчения спама SEO.
Sanitize:: Config:: RELAXED Позволяет использовать еще более широкий набор разметки, чем BASIC, включая изображения и таблицы. Ссылки по-прежнему ограничены протоколами FTP, HTTP, HTTPS и mailto, а изображения ограничены HTTP и HTTPS. В этом режиме он не добавляется к ссылкам.
Ответ 2
Санитация, безусловно, лучше, чем помощник "h" . Вместо того, чтобы избегать всего, он фактически позволяет указать теги html. И да, это предотвращает межсайтовый скриптинг, потому что он полностью удаляет javascript из микса.
Короче говоря, оба получат работу. Используйте "h" , когда вы не ожидаете ничего, кроме открытого текста, и используйте санитацию, если хотите разрешить некоторые, или вы считаете, что люди могут попытаться ввести его. Даже если вы запретите все теги с помощью санитарии, он будет "добираться" до кода, удалив их, а не избегая их, как "h" .
Что касается неполных тегов: вы можете запустить проверку на модели, которая передает html-содержащие поля через hpricot, но я думаю, что это чрезмерное количество в большинстве приложений.
Ответ 3
Лучший способ действия зависит от двух вещей:
- Ваша версия рельсов (2.x или 3.x)
- Предполагается ли, что ваши пользователи должны вводить любой html на входе или нет.
Как правило, я не разрешаю своим пользователям вводить html - вместо этого я позволяю им вводить текст.
На рейках 3.x:
Пользовательский ввод по умолчанию дезинфицирован. Вам не нужно ничего делать, если вы не хотите, чтобы ваши пользователи могли отправлять некоторые html. В этом случае продолжайте чтение.
Этот railscast касается атак XSS на рельсах 3.
На рельсах 2.x:
Если вы не разрешаете использовать html для своих пользователей, просто защитите свой вывод с помощью метода h
, например:
<%= h post.text %>
Если вы хотите, чтобы ваши пользователи отправили некоторый html: вы можете использовать метод rails sanitize
или HTML:: StathamSanitizer