Skip to content

Commit 237ab21

Browse files
hsbtnobu
authored andcommitted
[ruby/cgi] Escape/unescape unclosed tags as well
ruby/cgi@cd1eb08076 Co-authored-by: Nobuyoshi Nakada <nobu@ruby-lang.org>
1 parent fc60a04 commit 237ab21

File tree

2 files changed

+20
-2
lines changed

2 files changed

+20
-2
lines changed

lib/cgi/util.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -184,7 +184,7 @@ def unescapeHTML(string)
184184
def escapeElement(string, *elements)
185185
elements = elements[0] if elements[0].kind_of?(Array)
186186
unless elements.empty?
187-
string.gsub(/<\/?(?:#{elements.join("|")})(?!\w)(?:.|\n)*?>/i) do
187+
string.gsub(/<\/?(?:#{elements.join("|")})\b[^<>]*+>?/im) do
188188
CGI.escapeHTML($&)
189189
end
190190
else
@@ -204,7 +204,7 @@ def escapeElement(string, *elements)
204204
def unescapeElement(string, *elements)
205205
elements = elements[0] if elements[0].kind_of?(Array)
206206
unless elements.empty?
207-
string.gsub(/&lt;\/?(?:#{elements.join("|")})(?!\w)(?:.|\n)*?&gt;/i) do
207+
string.gsub(/&lt;\/?(?:#{elements.join("|")})\b(?>[^&]+|&(?![gl]t;)\w+;)*(?:&gt;)?/im) do
208208
unescapeHTML($&)
209209
end
210210
else

test/cgi/test_cgi_util.rb

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -269,6 +269,14 @@ def test_cgi_escapeElement
269269
assert_equal("<BR>&lt;A HREF=&quot;url&quot;&gt;&lt;/A&gt;", escapeElement('<BR><A HREF="url"></A>', ["A", "IMG"]))
270270
assert_equal("<BR>&lt;A HREF=&quot;url&quot;&gt;&lt;/A&gt;", escape_element('<BR><A HREF="url"></A>', "A", "IMG"))
271271
assert_equal("<BR>&lt;A HREF=&quot;url&quot;&gt;&lt;/A&gt;", escape_element('<BR><A HREF="url"></A>', ["A", "IMG"]))
272+
273+
assert_equal("&lt;A &lt;A HREF=&quot;url&quot;&gt;&lt;/A&gt;", escapeElement('<A <A HREF="url"></A>', "A", "IMG"))
274+
assert_equal("&lt;A &lt;A HREF=&quot;url&quot;&gt;&lt;/A&gt;", escapeElement('<A <A HREF="url"></A>', ["A", "IMG"]))
275+
assert_equal("&lt;A &lt;A HREF=&quot;url&quot;&gt;&lt;/A&gt;", escape_element('<A <A HREF="url"></A>', "A", "IMG"))
276+
assert_equal("&lt;A &lt;A HREF=&quot;url&quot;&gt;&lt;/A&gt;", escape_element('<A <A HREF="url"></A>', ["A", "IMG"]))
277+
278+
assert_equal("&lt;A &lt;A ", escapeElement('<A <A ', "A", "IMG"))
279+
assert_equal("&lt;A &lt;A ", escapeElement('<A <A ', ["A", "IMG"]))
272280
end
273281

274282

@@ -277,6 +285,16 @@ def test_cgi_unescapeElement
277285
assert_equal('&lt;BR&gt;<A HREF="url"></A>', unescapeElement(escapeHTML('<BR><A HREF="url"></A>'), ["A", "IMG"]))
278286
assert_equal('&lt;BR&gt;<A HREF="url"></A>', unescape_element(escapeHTML('<BR><A HREF="url"></A>'), "A", "IMG"))
279287
assert_equal('&lt;BR&gt;<A HREF="url"></A>', unescape_element(escapeHTML('<BR><A HREF="url"></A>'), ["A", "IMG"]))
288+
289+
assert_equal('<A <A HREF="url"></A>', unescapeElement(escapeHTML('<A <A HREF="url"></A>'), "A", "IMG"))
290+
assert_equal('<A <A HREF="url"></A>', unescapeElement(escapeHTML('<A <A HREF="url"></A>'), ["A", "IMG"]))
291+
assert_equal('<A <A HREF="url"></A>', unescape_element(escapeHTML('<A <A HREF="url"></A>'), "A", "IMG"))
292+
assert_equal('<A <A HREF="url"></A>', unescape_element(escapeHTML('<A <A HREF="url"></A>'), ["A", "IMG"]))
293+
294+
assert_equal('<A <A ', unescapeElement(escapeHTML('<A <A '), "A", "IMG"))
295+
assert_equal('<A <A ', unescapeElement(escapeHTML('<A <A '), ["A", "IMG"]))
296+
assert_equal('<A <A ', unescape_element(escapeHTML('<A <A '), "A", "IMG"))
297+
assert_equal('<A <A ', unescape_element(escapeHTML('<A <A '), ["A", "IMG"]))
280298
end
281299
end
282300

0 commit comments

Comments
 (0)