Rails Gem sanitize - Как сделать белый список - PullRequest
10 голосов
/ 08 ноября 2011

Прямо сейчас мы используем очищающий камень: https://github.com/rgrove/sanitize

Проблема в том, что если вы введете "hello & world", sanitize сохраняет это в БД как:

hello & world 

Как вы можете внести в белый список &. Мы хотим, чтобы sanitize удалил все возможные вредоносные теги html и JS / script. но мы можем позволить амперсанд.

Идеи? Спасибо

Ответы [ 4 ]

4 голосов
/ 09 ноября 2011

Вместо этого используйте метод strip_tags ().

http://api.rubyonrails.org/classes/ActionView/Helpers/SanitizeHelper.html#method-i-sanitize

3 голосов
/ 08 ноября 2011

Sanitize всегда преобразует то, что выводится в html-сущности для действительного html / xhtml.

Лучший способ определить это отфильтровать вывод

Sanitize.fragment("hello & world").gsub('&','&') #=> "Hello & world"
1 голос
/ 15 февраля 2012

Ответ UnixMonkey - это то, что мы в итоге сделали.

def remove_markup(html_str)
    marked_up = Sanitize.clean html_str

    ESCAPE_SEQUENCES.each do |esc_seq, ascii_seq|
      marked_up = marked_up.gsub('&' + esc_seq + ';', ascii_seq.chr)
    end
    marked_up
  end

Где ESCAPE_SEQUENCES был массивом символов, которые мы не хотели экранировать.

0 голосов
/ 08 февраля 2017

Начиная с Rails 4.2, #strip_tags не расшифровывает специальные символы HTML

strip_tags("fun & co")
  => "fun & co"

В противном случае вы получите следующее:

strip_tags("<script>")
  => "<script>"

Если вам нужен только амперсанд Iпредложил бы отфильтровать вывод, как предложено @Unixmonkey, и оставить его на & только

strip_tags("<bold>Hello & World</bold>").gsub(/&amp;/, "&")
  => "Hello & World"
...