Насколько хорош метод Rails sanitize ()? - PullRequest
14 голосов
/ 06 июня 2010

Могу ли я использовать ActionView :: Helpers :: SanitizeHelper # sanitize для введенного пользователем текста, который я планирую показать другим пользователям? Например, будет ли он правильно обрабатывать все случаи, описанные на этом сайте ?

Также в документации упоминается:

Обратите внимание, что дезинфекция предоставленный пользователем текст не гарантирует что полученная разметка действительна (в соответствии с типом документа) или даже хорошо сформирован. Выход может еще содержат, например, unescaped ’<’, ’>’, ’&’ символы и путать браузеры.

Какой лучший способ справиться с этим? Перед просмотром пропустите очищенный текст через Hpricot?

Ответы [ 3 ]

16 голосов
/ 17 февраля 2011

Ryan Grove's Sanitize идет намного дальше, чем Rails 3 sanitize. Это гарантирует, что выходной HTML будет правильно сформирован и имеет три встроенных белых списка:

Sanitize :: Config :: ОГРАНИЧЕННОГО Разрешает только очень простую встроенную разметку. Нет ссылок, изображений или элементов блока.

Sanitize :: Config :: BASIC Позволяет использовать разметку, включая теги форматирования, ссылки и списки. Изображения и таблицы недопустимы, ссылки ограничиваются протоколами FTP, HTTP, HTTPS и mailto, а атрибут добавляется ко всем ссылкам для предотвращения спама в SEO.

Sanitize :: Config :: RELAXED Позволяет использовать еще более широкий набор разметки, чем BASIC, включая изображения и таблицы. Ссылки по-прежнему ограничены протоколами FTP, HTTP, HTTPS и mailto, а изображения - только HTTP и HTTPS. В этом режиме не добавляются ссылки.

11 голосов
/ 27 октября 2010

Sanitize, безусловно, лучше, чем помощник "h". Вместо того, чтобы экранировать все, он фактически разрешает html-теги, которые вы укажете. И да, он предотвращает межсайтовый скриптинг, потому что полностью удаляет JavaScript из смеси.

Короче говоря, оба сделают свою работу. Используйте «h», если вы не ожидаете ничего, кроме открытого текста, и используйте sanitize, когда вы хотите разрешить некоторые из них, или вы полагаете, что люди могут попытаться ввести его. Даже если вы запретите все теги с помощью команды sanitize, он будет «убирать» код, удаляя их вместо экранирования, как это делает «h».

Что касается неполных тегов: вы можете запустить проверку модели, которая пропускает html-содержащие поля через hpricot, но я думаю, что это излишне в большинстве приложений.

4 голосов
/ 07 июня 2010

Лучший курс действий зависит от двух вещей:

  • Ваша версия рельсов (2.x или 3.x)
  • Предполагается ли, что ваши пользователи вообще вводят любой html на входе или нет.

Как правило, я не позволяю своим пользователям вводить html - вместо этого я позволяю им вводить текстиль.

На рельсах 3.x:

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

Этот RailSast имеет дело с XSS-атаками на рельсы 3.

На рельсах 2.x:

Если вы не разрешаете пользователям использовать html, просто защитите вывод с помощью метода h, например:

<%= h post.text %>

Если вы хотите, чтобы ваши пользователи отправляли html: вы можете использовать метод rails 'sanitize или HTML :: StathamSanitizer

...