Skip to content

Commit b52733a

Browse files
committed
Reject carriage return in header values to prevent header injection
The header value validation only checked for \n but not \r alone, which could allow smuggling control characters into HTTP headers. Closes #355.
1 parent 6eef4d0 commit b52733a

2 files changed

Lines changed: 9 additions & 1 deletion

File tree

lib/http/headers.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -335,7 +335,7 @@ def normalize_header(name)
335335
# @api private
336336
def validate_value(value)
337337
v = value.to_s
338-
return v unless v.include?("\n")
338+
return v unless v.include?("\n") || v.include?("\r")
339339

340340
raise HeaderError, "Invalid HTTP header field value: #{v.inspect}"
341341
end

test/http/headers_test.rb

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -651,6 +651,14 @@ def obj.inspect = "INSPECTED"
651651

652652
assert_includes err.message, '"bad\nvalue"'
653653
end
654+
655+
it "raises HeaderError when value contains a carriage return" do
656+
assert_raises(HTTP::HeaderError) { headers.add "X-Test", "foo\rbar" }
657+
end
658+
659+
it "raises HeaderError when value contains CRLF" do
660+
assert_raises(HTTP::HeaderError) { headers.add "X-Test", "foo\r\nbar" }
661+
end
654662
end
655663

656664
describe "#merge!" do

0 commit comments

Comments
 (0)