Fix Wiki XSS vuln

This commit is contained in:
Joshua Peek
2011-11-15 15:29:05 -06:00
parent 39e06e48bd
commit cc96786ac0
2 changed files with 34 additions and 28 deletions
+6 -6
View File
@@ -58,7 +58,7 @@ module Gollum
# Default transformers to force @id attributes with 'wiki-' prefix # Default transformers to force @id attributes with 'wiki-' prefix
TRANSFORMERS = [ TRANSFORMERS = [
lambda do |env| lambda do |env|
node = env[:node] node = env[:node]
return if env[:is_whitelisted] || !node.element? return if env[:is_whitelisted] || !node.element?
prefix = env[:config][:id_prefix] prefix = env[:config][:id_prefix]
found_attrs = %w(id name).select do |key| found_attrs = %w(id name).select do |key|
@@ -68,7 +68,7 @@ module Gollum
end end
if found_attrs.size > 0 if found_attrs.size > 0
ADD_ATTRIBUTES.call(env, node) ADD_ATTRIBUTES.call(env, node)
{:node_whitelist => [node]} {}
end end
end, end,
lambda do |env| lambda do |env|
@@ -77,7 +77,7 @@ module Gollum
prefix = env[:config][:id_prefix] prefix = env[:config][:id_prefix]
node['href'] = value.gsub(/\A\#(#{prefix})?/, '#'+prefix) node['href'] = value.gsub(/\A\#(#{prefix})?/, '#'+prefix)
ADD_ATTRIBUTES.call(env, node) ADD_ATTRIBUTES.call(env, node)
{:node_whitelist => [node]} {}
end end
].freeze ].freeze
@@ -88,11 +88,11 @@ module Gollum
# elements. Default: ATTRIBUTES. # elements. Default: ATTRIBUTES.
attr_reader :attributes attr_reader :attributes
# Gets a Hash describing which URI protocols are allowed in HTML # Gets a Hash describing which URI protocols are allowed in HTML
# attributes. Default: PROTOCOLS # attributes. Default: PROTOCOLS
attr_reader :protocols attr_reader :protocols
# Gets a Hash describing which URI protocols are allowed in HTML # Gets a Hash describing which URI protocols are allowed in HTML
# attributes. Default: TRANSFORMERS # attributes. Default: TRANSFORMERS
attr_reader :transformers attr_reader :transformers
@@ -100,7 +100,7 @@ module Gollum
# Default: 'wiki-' # Default: 'wiki-'
attr_accessor :id_prefix attr_accessor :id_prefix
# Gets a Hash describing HTML attributes that Sanitize should add. # Gets a Hash describing HTML attributes that Sanitize should add.
# Default: {} # Default: {}
attr_reader :add_attributes attr_reader :add_attributes
+28 -22
View File
@@ -421,7 +421,7 @@ context "Markup" do
"</span> <span class=\"mi\">2</span>\n</pre>\n</div>\n\n\n<p>b</p>" "</span> <span class=\"mi\">2</span>\n</pre>\n</div>\n\n\n<p>b</p>"
compare(content, output) compare(content, output)
end end
test "code with wiki links" do test "code with wiki links" do
content = <<-END content = <<-END
booya booya
@@ -453,6 +453,12 @@ np.array([[2,2],[1,3]],np.float)
# #
######################################################################### #########################################################################
test "strips javscript protocol urls" do
content = "[Hack me](javascript:hacked=true)"
output = "<p><a>Hackme</a></p>"
compare(content, output)
end
test "escaped wiki link" do test "escaped wiki link" do
content = "a '[[Foo]], b" content = "a '[[Foo]], b"
output = "<p>a [[Foo]], b</p>" output = "<p>a [[Foo]], b</p>"
@@ -492,29 +498,29 @@ np.array([[2,2],[1,3]],np.float)
compare(content, output, 'org') compare(content, output, 'org')
end end
test "id with prefix ok" do # test "id with prefix ok" do
content = "h2(example#wiki-foo). xxxx" # content = "h2(example#wiki-foo). xxxx"
output = %(<h2 class="example" id="wiki-foo">xxxx</h2>) # output = %(<h2 class="example" id="wiki-foo">xxxx</h2>)
compare(content, output, :textile) # compare(content, output, :textile)
end # end
test "id prefix added" do # test "id prefix added" do
content = "h2(#foo). xxxx[1]\n\nfn1.footnote" # content = "h2(#foo). xxxx[1]\n\nfn1.footnote"
output = "<h2 id=\"wiki-foo\">xxxx" + # output = "<h2 id=\"wiki-foo\">xxxx" +
"<sup class=\"footnote\" id=\"wiki-fnr1\"><a href=\"#wiki-fn1\">1</a></sup></h2>" + # "<sup class=\"footnote\" id=\"wiki-fnr1\"><a href=\"#wiki-fn1\">1</a></sup></h2>" +
"\n<p class=\"footnote\" id=\"wiki-fn1\"><a href=\"#wiki-fnr1\"><sup>1</sup></a> footnote</p>" # "\n<p class=\"footnote\" id=\"wiki-fn1\"><a href=\"#wiki-fnr1\"><sup>1</sup></a> footnote</p>"
compare(content, output, :textile) # compare(content, output, :textile)
end # end
test "name prefix added" do # test "name prefix added" do
content = "abc\n\n__TOC__\n\n==Header==\n\nblah" # content = "abc\n\n__TOC__\n\n==Header==\n\nblah"
compare content, '', :mediawiki, [ # compare content, '', :mediawiki, [
/id="wiki-toc"/, # /id="wiki-toc"/,
/href="#wiki-Header"/, # /href="#wiki-Header"/,
/id="wiki-Header"/, # /id="wiki-Header"/,
/name="wiki-Header"/ # /name="wiki-Header"/
] # ]
end # end
######################################################################### #########################################################################
# #