Skip to content

Commit da7aadf

Browse files
hsbtnobu
andcommitted
Escape/unescape unclosed tags as well
Co-authored-by: Nobuyoshi Nakada <[email protected]>
1 parent 2c2d89e commit da7aadf

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
@@ -178,7 +178,7 @@ def unescapeHTML(string)
178178
def escapeElement(string, *elements)
179179
elements = elements[0] if elements[0].kind_of?(Array)
180180
unless elements.empty?
181-
string.gsub(/<\/?(?:#{elements.join("|")})(?!\w)(?:.|\n)*?>/i) do
181+
string.gsub(/<\/?(?:#{elements.join("|")})\b[^<>]*+>?/im) do
182182
CGI.escapeHTML($&)
183183
end
184184
else
@@ -198,7 +198,7 @@ def escapeElement(string, *elements)
198198
def unescapeElement(string, *elements)
199199
elements = elements[0] if elements[0].kind_of?(Array)
200200
unless elements.empty?
201-
string.gsub(/&lt;\/?(?:#{elements.join("|")})(?!\w)(?:.|\n)*?&gt;/i) do
201+
string.gsub(/&lt;\/?(?:#{elements.join("|")})\b(?>[^&]+|&(?![gl]t;)\w+;)*(?:&gt;)?/im) do
202202
unescapeHTML($&)
203203
end
204204
else

test/cgi/test_cgi_util.rb

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -244,6 +244,14 @@ def test_cgi_escapeElement
244244
assert_equal("<BR>&lt;A HREF=&quot;url&quot;&gt;&lt;/A&gt;", escapeElement('<BR><A HREF="url"></A>', ["A", "IMG"]))
245245
assert_equal("<BR>&lt;A HREF=&quot;url&quot;&gt;&lt;/A&gt;", escape_element('<BR><A HREF="url"></A>', "A", "IMG"))
246246
assert_equal("<BR>&lt;A HREF=&quot;url&quot;&gt;&lt;/A&gt;", escape_element('<BR><A HREF="url"></A>', ["A", "IMG"]))
247+
248+
assert_equal("&lt;A &lt;A HREF=&quot;url&quot;&gt;&lt;/A&gt;", escapeElement('<A <A HREF="url"></A>', "A", "IMG"))
249+
assert_equal("&lt;A &lt;A HREF=&quot;url&quot;&gt;&lt;/A&gt;", escapeElement('<A <A HREF="url"></A>', ["A", "IMG"]))
250+
assert_equal("&lt;A &lt;A HREF=&quot;url&quot;&gt;&lt;/A&gt;", escape_element('<A <A HREF="url"></A>', "A", "IMG"))
251+
assert_equal("&lt;A &lt;A HREF=&quot;url&quot;&gt;&lt;/A&gt;", escape_element('<A <A HREF="url"></A>', ["A", "IMG"]))
252+
253+
assert_equal("&lt;A &lt;A ", escapeElement('<A <A ', "A", "IMG"))
254+
assert_equal("&lt;A &lt;A ", escapeElement('<A <A ', ["A", "IMG"]))
247255
end
248256

249257

@@ -252,6 +260,16 @@ def test_cgi_unescapeElement
252260
assert_equal('&lt;BR&gt;<A HREF="url"></A>', unescapeElement(escapeHTML('<BR><A HREF="url"></A>'), ["A", "IMG"]))
253261
assert_equal('&lt;BR&gt;<A HREF="url"></A>', unescape_element(escapeHTML('<BR><A HREF="url"></A>'), "A", "IMG"))
254262
assert_equal('&lt;BR&gt;<A HREF="url"></A>', unescape_element(escapeHTML('<BR><A HREF="url"></A>'), ["A", "IMG"]))
263+
264+
assert_equal('<A <A HREF="url"></A>', unescapeElement(escapeHTML('<A <A HREF="url"></A>'), "A", "IMG"))
265+
assert_equal('<A <A HREF="url"></A>', unescapeElement(escapeHTML('<A <A HREF="url"></A>'), ["A", "IMG"]))
266+
assert_equal('<A <A HREF="url"></A>', unescape_element(escapeHTML('<A <A HREF="url"></A>'), "A", "IMG"))
267+
assert_equal('<A <A HREF="url"></A>', unescape_element(escapeHTML('<A <A HREF="url"></A>'), ["A", "IMG"]))
268+
269+
assert_equal('<A <A ', unescapeElement(escapeHTML('<A <A '), "A", "IMG"))
270+
assert_equal('<A <A ', unescapeElement(escapeHTML('<A <A '), ["A", "IMG"]))
271+
assert_equal('<A <A ', unescape_element(escapeHTML('<A <A '), "A", "IMG"))
272+
assert_equal('<A <A ', unescape_element(escapeHTML('<A <A '), ["A", "IMG"]))
255273
end
256274
end
257275

0 commit comments

Comments
 (0)