rails-html-sanitizer 1.1.0 → 1.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of rails-html-sanitizer might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/CHANGELOG.md +44 -0
- data/README.md +3 -1
- data/lib/rails-html-sanitizer.rb +0 -2
- data/lib/rails/html/sanitizer.rb +1 -4
- data/lib/rails/html/sanitizer/version.rb +1 -1
- data/lib/rails/html/scrubbers.rb +5 -5
- data/test/sanitizer_test.rb +14 -5
- data/test/scrubbers_test.rb +44 -0
- metadata +11 -13
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 38acab5c0aaf09ef2f52189de3445647192a0625e7bf530f8e08edb60ce7f17b
|
4
|
+
data.tar.gz: ba0f051dbdf277df8f135dce164d90cbc2acee95b9965986bdc00742ea0a0553
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3c73a294fed5e28ab21b9fbade61fc722c2876c79215f4c84fa618d99c356e532584746d7178c1a2cc08354699eb986a741a2011b0c268cf8b3cc1bfa6a56994
|
7
|
+
data.tar.gz: 561a2601cd732428f89a662e53076bc557e591892f952b46770f10b014cbbd5cf1192a5a70de5f44f296be3a9f4820c6a5412c36464f939b4ca51a70fdf33c69
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,47 @@
|
|
1
|
+
## 1.4.1 / 2021-08-18
|
2
|
+
|
3
|
+
* Fix regression in v1.4.0 that did not pass comment nodes to the scrubber.
|
4
|
+
|
5
|
+
Some scrubbers will want to override the default behavior and allow comments, but v1.4.0 only
|
6
|
+
passed through elements to the scrubber's `keep_node?` method.
|
7
|
+
|
8
|
+
This change once again allows the scrubber to make the decision on comment nodes, but still skips
|
9
|
+
other non-elements like processing instructions (see #115).
|
10
|
+
|
11
|
+
*Mike Dalessio*
|
12
|
+
|
13
|
+
## 1.4.0 / 2021-08-18
|
14
|
+
|
15
|
+
* Processing Instructions are no longer allowed by Rails::Html::PermitScrubber
|
16
|
+
|
17
|
+
Previously, a PI with a name (or "target") matching an allowed tag name was not scrubbed. There
|
18
|
+
are no known security issues associated with these PIs, but similar to comments it's preferred to
|
19
|
+
omit these nodes when possible from sanitized output.
|
20
|
+
|
21
|
+
Fixes #115.
|
22
|
+
|
23
|
+
*Mike Dalessio*
|
24
|
+
|
25
|
+
## 1.3.0
|
26
|
+
|
27
|
+
* Address deprecations in Loofah 2.3.0.
|
28
|
+
|
29
|
+
*Josh Goodall*
|
30
|
+
|
31
|
+
## 1.2.0
|
32
|
+
|
33
|
+
* Remove needless `white_list_sanitizer` deprecation.
|
34
|
+
|
35
|
+
By deprecating this, we were forcing Rails 5.2 to be updated or spew
|
36
|
+
deprecations that users could do nothing about.
|
37
|
+
|
38
|
+
That's pointless and I'm sorry for adding that!
|
39
|
+
|
40
|
+
Now there's no deprecation warning and Rails 5.2 works out of the box, while
|
41
|
+
Rails 6 can use the updated naming.
|
42
|
+
|
43
|
+
*Kasper Timm Hansen*
|
44
|
+
|
1
45
|
## 1.1.0
|
2
46
|
|
3
47
|
* Add `safe_list_sanitizer` and deprecate `white_list_sanitizer` to be removed
|
data/README.md
CHANGED
@@ -81,8 +81,10 @@ html_fragment.to_s # => "<a></a>"
|
|
81
81
|
#### `Rails::Html::TargetScrubber`
|
82
82
|
|
83
83
|
Where `PermitScrubber` picks out tags and attributes to permit in sanitization,
|
84
|
-
`Rails::Html::TargetScrubber` targets them for removal.
|
84
|
+
`Rails::Html::TargetScrubber` targets them for removal. See https://github.com/flavorjones/loofah/blob/main/lib/loofah/html5/safelist.rb for the tag list.
|
85
85
|
|
86
|
+
**Note:** by default, it will scrub anything that is not part of the permitted tags from
|
87
|
+
loofah `HTML5::Scrub.allowed_element?`.
|
86
88
|
|
87
89
|
```ruby
|
88
90
|
scrubber = Rails::Html::TargetScrubber.new
|
data/lib/rails-html-sanitizer.rb
CHANGED
data/lib/rails/html/sanitizer.rb
CHANGED
@@ -74,7 +74,7 @@ module Rails
|
|
74
74
|
#
|
75
75
|
# === Options
|
76
76
|
# Sanitizes both html and css via the safe lists found here:
|
77
|
-
# https://github.com/flavorjones/loofah/blob/master/lib/loofah/html5/
|
77
|
+
# https://github.com/flavorjones/loofah/blob/master/lib/loofah/html5/safelist.rb
|
78
78
|
#
|
79
79
|
# SafeListSanitizer also accepts options to configure
|
80
80
|
# the safe list used when sanitizing html.
|
@@ -151,8 +151,5 @@ module Rails
|
|
151
151
|
end
|
152
152
|
|
153
153
|
WhiteListSanitizer = SafeListSanitizer
|
154
|
-
if Object.respond_to?(:deprecate_constant)
|
155
|
-
deprecate_constant :WhiteListSanitizer
|
156
|
-
end
|
157
154
|
end
|
158
155
|
end
|
data/lib/rails/html/scrubbers.rb
CHANGED
@@ -68,7 +68,7 @@ module Rails
|
|
68
68
|
end
|
69
69
|
return CONTINUE if skip_node?(node)
|
70
70
|
|
71
|
-
unless keep_node?(node)
|
71
|
+
unless (node.comment? || node.element?) && keep_node?(node)
|
72
72
|
return STOP if scrub_node(node) == STOP
|
73
73
|
end
|
74
74
|
|
@@ -138,17 +138,17 @@ module Rails
|
|
138
138
|
attr_node.node_name
|
139
139
|
end
|
140
140
|
|
141
|
-
if Loofah::HTML5::
|
141
|
+
if Loofah::HTML5::SafeList::ATTR_VAL_IS_URI.include?(attr_name)
|
142
142
|
# this block lifted nearly verbatim from HTML5 sanitization
|
143
143
|
val_unescaped = CGI.unescapeHTML(attr_node.value).gsub(Loofah::HTML5::Scrub::CONTROL_CHARACTERS,'').downcase
|
144
|
-
if val_unescaped =~ /^[a-z0-9][-+.a-z0-9]*:/ && ! Loofah::HTML5::
|
144
|
+
if val_unescaped =~ /^[a-z0-9][-+.a-z0-9]*:/ && ! Loofah::HTML5::SafeList::ALLOWED_PROTOCOLS.include?(val_unescaped.split(Loofah::HTML5::SafeList::PROTOCOL_SEPARATOR)[0])
|
145
145
|
attr_node.remove
|
146
146
|
end
|
147
147
|
end
|
148
|
-
if Loofah::HTML5::
|
148
|
+
if Loofah::HTML5::SafeList::SVG_ATTR_VAL_ALLOWS_REF.include?(attr_name)
|
149
149
|
attr_node.value = attr_node.value.gsub(/url\s*\(\s*[^#\s][^)]+?\)/m, ' ') if attr_node.value
|
150
150
|
end
|
151
|
-
if Loofah::HTML5::
|
151
|
+
if Loofah::HTML5::SafeList::SVG_ALLOW_LOCAL_HREF.include?(node.name) && attr_name == 'xlink:href' && attr_node.value =~ /^\s*[^#\s].*/m
|
152
152
|
attr_node.remove
|
153
153
|
end
|
154
154
|
|
data/test/sanitizer_test.rb
CHANGED
@@ -93,7 +93,7 @@ class SanitizersTest < Minitest::Test
|
|
93
93
|
end
|
94
94
|
|
95
95
|
def test_strip_tags_with_plaintext
|
96
|
-
assert_equal "
|
96
|
+
assert_equal "Don't touch me", full_sanitize("Don't touch me")
|
97
97
|
end
|
98
98
|
|
99
99
|
def test_strip_tags_with_tags
|
@@ -135,7 +135,7 @@ class SanitizersTest < Minitest::Test
|
|
135
135
|
end
|
136
136
|
|
137
137
|
def test_strip_links_with_plaintext
|
138
|
-
assert_equal "
|
138
|
+
assert_equal "Don't touch me", link_sanitize("Don't touch me")
|
139
139
|
end
|
140
140
|
|
141
141
|
def test_strip_links_with_line_feed_and_uppercase_tag
|
@@ -181,7 +181,7 @@ class SanitizersTest < Minitest::Test
|
|
181
181
|
assert_sanitized raw, %{src="javascript:bang" <img width="5">foo</img>, <span>bar</span>}
|
182
182
|
end
|
183
183
|
|
184
|
-
tags = Loofah::HTML5::
|
184
|
+
tags = Loofah::HTML5::SafeList::ALLOWED_ELEMENTS - %w(script form)
|
185
185
|
tags.each do |tag_name|
|
186
186
|
define_method "test_should_allow_#{tag_name}_tag" do
|
187
187
|
scope_allowed_tags(tags) do
|
@@ -271,7 +271,8 @@ class SanitizersTest < Minitest::Test
|
|
271
271
|
|
272
272
|
def test_scrub_style_if_style_attribute_option_is_passed
|
273
273
|
input = '<p style="color: #000; background-image: url(http://www.ragingplatypus.com/i/cam-full.jpg);"></p>'
|
274
|
-
|
274
|
+
actual = safe_list_sanitize(input, attributes: %w(style))
|
275
|
+
assert_includes(['<p style="color: #000;"></p>', '<p style="color:#000;"></p>'], actual)
|
275
276
|
end
|
276
277
|
|
277
278
|
def test_should_raise_argument_error_if_tags_is_not_enumerable
|
@@ -413,7 +414,7 @@ class SanitizersTest < Minitest::Test
|
|
413
414
|
end
|
414
415
|
|
415
416
|
def test_should_sanitize_div_background_image_unicode_encoded
|
416
|
-
raw = %(background-image:\
|
417
|
+
raw = %(background-image:\u0075\u0072\u006C\u0028\u0027\u006a\u0061\u0076\u0061\u0073\u0063\u0072\u0069\u0070\u0074\u003a\u0061\u006c\u0065\u0072\u0074\u0028\u0031\u0032\u0033\u0034\u0029\u0027\u0029)
|
417
418
|
assert_equal '', sanitize_css(raw)
|
418
419
|
end
|
419
420
|
|
@@ -520,6 +521,14 @@ class SanitizersTest < Minitest::Test
|
|
520
521
|
assert_equal %{<a action=\"examp<!--%22%20unsafeattr=foo()>-->le.com\">test</a>}, text
|
521
522
|
end
|
522
523
|
|
524
|
+
def test_exclude_node_type_processing_instructions
|
525
|
+
assert_equal("<div>text</div><b>text</b>", safe_list_sanitize("<div>text</div><?div content><b>text</b>"))
|
526
|
+
end
|
527
|
+
|
528
|
+
def test_exclude_node_type_comment
|
529
|
+
assert_equal("<div>text</div><b>text</b>", safe_list_sanitize("<div>text</div><!-- comment --><b>text</b>"))
|
530
|
+
end
|
531
|
+
|
523
532
|
protected
|
524
533
|
|
525
534
|
def xpath_sanitize(input, options = {})
|
data/test/scrubbers_test.rb
CHANGED
@@ -112,6 +112,50 @@ class PermitScrubberTest < ScrubberTest
|
|
112
112
|
end
|
113
113
|
end
|
114
114
|
|
115
|
+
class PermitScrubberSubclassTest < ScrubberTest
|
116
|
+
def setup
|
117
|
+
@scrubber = Class.new(::Rails::Html::PermitScrubber) do
|
118
|
+
attr :nodes_seen
|
119
|
+
|
120
|
+
def initialize
|
121
|
+
super()
|
122
|
+
@nodes_seen = []
|
123
|
+
end
|
124
|
+
|
125
|
+
def keep_node?(node)
|
126
|
+
@nodes_seen << node.name
|
127
|
+
super(node)
|
128
|
+
end
|
129
|
+
end.new
|
130
|
+
end
|
131
|
+
|
132
|
+
def test_elements_are_checked
|
133
|
+
html = %Q("<div></div><a></a><tr></tr>")
|
134
|
+
Loofah.scrub_fragment(html, @scrubber)
|
135
|
+
assert_includes(@scrubber.nodes_seen, "div")
|
136
|
+
assert_includes(@scrubber.nodes_seen, "a")
|
137
|
+
assert_includes(@scrubber.nodes_seen, "tr")
|
138
|
+
end
|
139
|
+
|
140
|
+
def test_comments_are_checked
|
141
|
+
# this passes in v1.3.0 but fails in v1.4.0
|
142
|
+
html = %Q("<div></div><!-- ohai --><tr></tr>")
|
143
|
+
Loofah.scrub_fragment(html, @scrubber)
|
144
|
+
assert_includes(@scrubber.nodes_seen, "div")
|
145
|
+
assert_includes(@scrubber.nodes_seen, "comment")
|
146
|
+
assert_includes(@scrubber.nodes_seen, "tr")
|
147
|
+
end
|
148
|
+
|
149
|
+
def test_craftily_named_processing_instructions_are_not_checked
|
150
|
+
# this fails in v1.3.0 but passes in v1.4.0
|
151
|
+
html = %Q("<div></div><?a content><tr></tr>")
|
152
|
+
Loofah.scrub_fragment(html, @scrubber)
|
153
|
+
assert_includes(@scrubber.nodes_seen, "div")
|
154
|
+
refute_includes(@scrubber.nodes_seen, "a")
|
155
|
+
assert_includes(@scrubber.nodes_seen, "tr")
|
156
|
+
end
|
157
|
+
end
|
158
|
+
|
115
159
|
class TargetScrubberTest < ScrubberTest
|
116
160
|
def setup
|
117
161
|
@scrubber = Rails::Html::TargetScrubber.new
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rails-html-sanitizer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.1
|
4
|
+
version: 1.4.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Rafael Mendonça França
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2021-08-18 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: loofah
|
@@ -17,20 +17,14 @@ dependencies:
|
|
17
17
|
requirements:
|
18
18
|
- - "~>"
|
19
19
|
- !ruby/object:Gem::Version
|
20
|
-
version: '2.
|
21
|
-
- - ">="
|
22
|
-
- !ruby/object:Gem::Version
|
23
|
-
version: 2.2.2
|
20
|
+
version: '2.3'
|
24
21
|
type: :runtime
|
25
22
|
prerelease: false
|
26
23
|
version_requirements: !ruby/object:Gem::Requirement
|
27
24
|
requirements:
|
28
25
|
- - "~>"
|
29
26
|
- !ruby/object:Gem::Version
|
30
|
-
version: '2.
|
31
|
-
- - ">="
|
32
|
-
- !ruby/object:Gem::Version
|
33
|
-
version: 2.2.2
|
27
|
+
version: '2.3'
|
34
28
|
- !ruby/object:Gem::Dependency
|
35
29
|
name: bundler
|
36
30
|
requirement: !ruby/object:Gem::Requirement
|
@@ -107,7 +101,11 @@ files:
|
|
107
101
|
homepage: https://github.com/rails/rails-html-sanitizer
|
108
102
|
licenses:
|
109
103
|
- MIT
|
110
|
-
metadata:
|
104
|
+
metadata:
|
105
|
+
bug_tracker_uri: https://github.com/rails/rails-html-sanitizer/issues
|
106
|
+
changelog_uri: https://github.com/rails/rails-html-sanitizer/blob/v1.4.1/CHANGELOG.md
|
107
|
+
documentation_uri: https://www.rubydoc.info/gems/rails-html-sanitizer/1.4.1
|
108
|
+
source_code_uri: https://github.com/rails/rails-html-sanitizer/tree/v1.4.1
|
111
109
|
post_install_message:
|
112
110
|
rdoc_options: []
|
113
111
|
require_paths:
|
@@ -123,10 +121,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
123
121
|
- !ruby/object:Gem::Version
|
124
122
|
version: '0'
|
125
123
|
requirements: []
|
126
|
-
rubygems_version: 3.
|
124
|
+
rubygems_version: 3.2.15
|
127
125
|
signing_key:
|
128
126
|
specification_version: 4
|
129
127
|
summary: This gem is responsible to sanitize HTML fragments in Rails applications.
|
130
128
|
test_files:
|
131
|
-
- test/scrubbers_test.rb
|
132
129
|
- test/sanitizer_test.rb
|
130
|
+
- test/scrubbers_test.rb
|