Skip to content

Commit 188e66b

Browse files
committed
html_safe option protects against comment injection
When encoding with the html_safe option, also encode `<` into `\\u003C` to protect against injecting `<!--` HTML comments into JSON. Closes michalmuskala#109
1 parent 91a4eaf commit 188e66b

File tree

2 files changed

+4
-3
lines changed

2 files changed

+4
-3
lines changed

lib/encode.ex

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -261,7 +261,7 @@ defmodule Jason.Encode do
261261
slash_escapes = Enum.zip('\b\t\n\f\r\"\\', 'btnfr"\\')
262262
surogate_escapes = Enum.zip([0x2028, 0x2029], ["\\u2028", "\\u2029"])
263263
ranges = [{0x00..0x1F, :unicode} | slash_escapes]
264-
html_ranges = [{0x00..0x1F, :unicode}, {?/, ?/} | slash_escapes]
264+
html_ranges = [{0x00..0x1F, :unicode}, {?<, :unicode}, {?/, ?/} | slash_escapes]
265265
escape_jt = Codegen.jump_table(html_ranges, :error)
266266

267267
Enum.each(escape_jt, fn

test/encode_test.exs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,9 @@ defmodule Jason.EncoderTest do
3030
assert to_json("☃a", escape: :unicode_safe) == ~s("\\u2603a")
3131
assert to_json("𝄞b", escape: :unicode_safe) == ~s("\\uD834\\uDD1Eb")
3232
assert to_json("\u2028\u2029abc", escape: :javascript_safe) == ~s("\\u2028\\u2029abc")
33-
assert to_json("</script>", escape: :html_safe) == ~s("<\\/script>")
34-
assert to_json(~s(<script>var s = "\u2028\u2029";</script>), escape: :html_safe) == ~s("<script>var s = \\\"\\u2028\\u2029\\\";<\\/script>")
33+
assert to_json("</script>", escape: :html_safe) == ~s("\\u003C\\/script>")
34+
assert to_json(~s(<script>var s = "\u2028\u2029";</script>), escape: :html_safe) == ~s("\\u003Cscript>var s = \\\"\\u2028\\u2029\\\";\\u003C\\/script>")
35+
assert to_json("<!-- fake comment", escape: :html_safe) == ~s("\\u003C!-- fake comment")
3536
assert to_json("áéíóúàèìòùâêîôûãẽĩõũ") == ~s("áéíóúàèìòùâêîôûãẽĩõũ")
3637
assert to_json("a\u2028a", escape: :javascript_safe) == ~s("a\\u2028a")
3738
assert to_json("a\u2028a", escape: :html_safe) == ~s("a\\u2028a")

0 commit comments

Comments
 (0)