sanitize和strip_tags rails之间的区别

时间:2014-11-05 10:32:21

标签: ruby-on-rails actionviewhelper

我完全不知道这些之间的区别。 我读了这个

http://api.rubyonrails.org/classes/ActionView/Helpers/SanitizeHelper.html

但并没有得到确切的区别。 谁能让我知道区别?

2 个答案:

答案 0 :(得分:3)

sanitize正在使用白名单清洁剂。 strip_tags删除所有标记。

比较

[64] pry(main)> sanitize "hello <h1>h1</h1> <b>b</b>"
=> "hello <h1>h1</h1> <b>b</b>"
[65] pry(main)> strip_tags "hello <h1>h1</h1> <b>b</b>"
=> "hello h1 b"

如果您不提供任何列入白名单的代码,sanitize默认情况下会允许使用以下代码。

[66] pry(main)> ActionView::Base.white_list_sanitizer.allowed_tags.to_a * ', '
=> "strong, em, b, i, p, code, pre, tt, samp, kbd, var, sub, sup,
dfn, cite, big, small, address, hr, br, div, span, h1, h2, h3,
h4, h5, h6, ul, ol, li, dl, dt, dd, abbr, acronym, a, img,
blockquote, del, ins"

如果您提供自己的白名单标签,则会覆盖默认标签。

[67] pry(main)> sanitize "hello <h1>h1</h1> <b>b</b>", tags: %w(b)
=> "hello h1 <b>b</b>"

sanitizestrip_tags之间的另一个区别是sanitize删除了某些代码的内容(介于两者之间的内容),尤其是<script>代码。

比较

[68] pry(main)> sanitize "a<script>alet('foo')</script>"
=> "a"
[69] pry(main)> strip_tags "a<script>alet('foo')</script>"
=> "aalet('foo')"

此外,sanitize为某些字符执行html-escape,但strip_tags没有。

[70] pry(main)> sanitize "< &"
=> "&lt; &"
[71] pry(main)> strip_tags "< &"
=> "< &"

此外,它们以不同方式处理嵌套标记。比较以下内容,

[73] pry(main)> sanitize "some<<b>script>alert('hello')<</b>/script>", tags: []
=> "some&lt;script>alert('hello')&lt;/script>"
[74] pry(main)> strip_tags "some<<b>script>alert('hello')<</b>/script>"
=> "somealert('hello')"

答案 1 :(得分:2)

使用sanitize,你可以允许一些HTML标签或类,strip_tags不能。它做同样的事情。检查代码https://github.com/rails/rails/blob/76a0b1028e312b6c3c00a50b4a09d68c23b5e713/actionview/lib/action_view/helpers/sanitize_helper.rb#L80