Rails3 и безопасный nl2br! - PullRequest
15 голосов
/ 16 мая 2010

У меня есть система, чтобы пользователи могли оставлять комментарии.

Комментарии вводятся в текстовую область.

Моя проблема - отформатировать комментарии с тегом br, чтобы заменить \ n

На самом деле, я мог бы сделать что-то подобное

s.gsub(/\n/, '<br />')

Но защита xss, в том числе и в рельсах, избегает тегов br.

Так что я мог бы сделать это

s.gsub(/\n/, '<br />').html_safe

Но тогда все теги принимаются даже сценарием .... вызывая большую проблему безопасности

Итак, мой вопрос: как безопасно отформатировать текст с помощью br?

Спасибо

EDIT: Сейчас я добавил это

  def sanitaze
    self.gsub(/(<.*?>)/, '')
  end

  def nl2br
    self.sanitaze.gsub(/\n/, '<br />').html_safe
  end

Ответы [ 3 ]

54 голосов
/ 18 марта 2011

Как предположил Райан Бигг, simple_format - лучший инструмент для работы: он «безопасен» и намного аккуратнее других решений.

так что для @var:

<%= simple_format(@var) %>

Если вам нужно очистить текст, чтобы избавиться от тегов HTML, вы должны сделать это до того, как передаст его simple_format

http://api.rubyonrails.org/classes/ActionView/Helpers/TextHelper.html#method-i-simple_format

2 голосов
/ 06 июня 2010

Лучший способ решить эту проблему - использовать метод sanitize для удаления всего, кроме тега BR, который мы хотим.

Предположим, что у нас есть @var с содержанием "some\ntext":

Попытка <%= @var.gsub(/\n/, '<br />') %> не работает.

Попытка <%= h @var.gsub(/\n/, '<br />').html_safe %> не работает и небезопасна.

Попытка <%= sanitize(@var.gsub(/\n/, '<br />'), :tags => %w(br) %> РАБОТАЕТ.

Я не очень хорошо это проверил, но он позволяет тэгу BR работать и заменил фиктивное предупреждение скрипта, которое я добавил, пробелом, так что, похоже, он выполняет свою работу. Если у кого-то есть идея или вы можете сказать, является ли это безопасным решением, сделайте это.

Обновление:

Другая идея, предложенная Хосе Валимом:

<%= h(@var).gsub(/\n/, '<br />') %> Работы

1 голос
/ 16 апреля 2015

Вот что я сделал :

module ApplicationHelper
  def nl2br s
    sanitize(s, tags: []).gsub(/\n/, '<br>').html_safe
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...