Насколько хорош метод 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