зеркало из https://github.com/github/ruby.git
lib/webrick/log.rb: sanitize any type of logs
It had failed to sanitize some type of exception messages. Reported and patched by Yusuke Endoh (mame) at https://hackerone.com/reports/223363 git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@59897 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
Родитель
7df1e45bb6
Коммит
6617c41292
|
@ -23,10 +23,6 @@ module WEBrick
|
|||
##
|
||||
# Root of the HTTP status class hierarchy
|
||||
class Status < StandardError
|
||||
def initialize(*args) # :nodoc:
|
||||
args[0] = AccessLog.escape(args[0]) unless args.empty?
|
||||
super(*args)
|
||||
end
|
||||
class << self
|
||||
attr_reader :code, :reason_phrase # :nodoc:
|
||||
end
|
||||
|
|
|
@ -118,10 +118,10 @@ module WEBrick
|
|||
# * Otherwise it will return +arg+.inspect.
|
||||
def format(arg)
|
||||
if arg.is_a?(Exception)
|
||||
"#{arg.class}: #{arg.message}\n\t" <<
|
||||
"#{arg.class}: #{AccessLog.escape(arg.message)}\n\t" <<
|
||||
arg.backtrace.join("\n\t") << "\n"
|
||||
elsif arg.respond_to?(:to_str)
|
||||
arg.to_str
|
||||
AccessLog.escape(arg.to_str)
|
||||
else
|
||||
arg.inspect
|
||||
end
|
||||
|
|
|
@ -103,6 +103,42 @@ class TestWEBrickHTTPAuth < Test::Unit::TestCase
|
|||
}
|
||||
end
|
||||
|
||||
def test_bad_username_with_control_characters
|
||||
log_tester = lambda {|log, access_log|
|
||||
assert_equal(2, log.length)
|
||||
assert_match(/ERROR Basic WEBrick's realm: foo\\ebar: the user is not allowed./, log[0])
|
||||
assert_match(/ERROR WEBrick::HTTPStatus::Unauthorized/, log[1])
|
||||
}
|
||||
TestWEBrick.start_httpserver({}, log_tester) {|server, addr, port, log|
|
||||
realm = "WEBrick's realm"
|
||||
path = "/basic_auth"
|
||||
|
||||
Tempfile.create("test_webrick_auth") {|tmpfile|
|
||||
tmpfile.close
|
||||
tmp_pass = WEBrick::HTTPAuth::Htpasswd.new(tmpfile.path)
|
||||
tmp_pass.set_passwd(realm, "webrick", "supersecretpassword")
|
||||
tmp_pass.set_passwd(realm, "foo", "supersecretpassword")
|
||||
tmp_pass.flush
|
||||
|
||||
htpasswd = WEBrick::HTTPAuth::Htpasswd.new(tmpfile.path)
|
||||
users = []
|
||||
htpasswd.each{|user, pass| users << user }
|
||||
server.mount_proc(path){|req, res|
|
||||
auth = WEBrick::HTTPAuth::BasicAuth.new(
|
||||
:Realm => realm, :UserDB => htpasswd,
|
||||
:Logger => server.logger
|
||||
)
|
||||
auth.authenticate(req, res)
|
||||
res.body = "hoge"
|
||||
}
|
||||
http = Net::HTTP.new(addr, port)
|
||||
g = Net::HTTP::Get.new(path)
|
||||
g.basic_auth("foo\ebar", "passwd")
|
||||
http.request(g){|res| assert_not_equal("hoge", res.body, log.call) }
|
||||
}
|
||||
}
|
||||
end
|
||||
|
||||
DIGESTRES_ = /
|
||||
([a-zA-Z\-]+)
|
||||
[ \t]*(?:\r\n[ \t]*)*
|
||||
|
|
Загрузка…
Ссылка в новой задаче