Skip to content

Commit cb03d48

Browse files
authored
Merge pull request #934 from nobu/h1-1321358-xss
Escape file names
2 parents 1c361de + 13b9da5 commit cb03d48

File tree

6 files changed

+40
-17
lines changed

6 files changed

+40
-17
lines changed

lib/rdoc/generator/template/darkfish/_head.rhtml

+10-10
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,18 @@
33
<title><%= h @title %></title>
44

55
<script type="text/javascript">
6-
var rdoc_rel_prefix = "<%= asset_rel_prefix %>/";
7-
var index_rel_prefix = "<%= rel_prefix %>/";
6+
var rdoc_rel_prefix = "<%= h asset_rel_prefix %>/";
7+
var index_rel_prefix = "<%= h rel_prefix %>/";
88
</script>
99

10-
<script src="<%= asset_rel_prefix %>/js/navigation.js" defer></script>
11-
<script src="<%= asset_rel_prefix %>/js/search.js" defer></script>
12-
<script src="<%= asset_rel_prefix %>/js/search_index.js" defer></script>
13-
<script src="<%= asset_rel_prefix %>/js/searcher.js" defer></script>
14-
<script src="<%= asset_rel_prefix %>/js/darkfish.js" defer></script>
10+
<script src="<%= h asset_rel_prefix %>/js/navigation.js" defer></script>
11+
<script src="<%= h asset_rel_prefix %>/js/search.js" defer></script>
12+
<script src="<%= h asset_rel_prefix %>/js/search_index.js" defer></script>
13+
<script src="<%= h asset_rel_prefix %>/js/searcher.js" defer></script>
14+
<script src="<%= h asset_rel_prefix %>/js/darkfish.js" defer></script>
1515

16-
<link href="<%= asset_rel_prefix %>/css/fonts.css" rel="stylesheet">
17-
<link href="<%= asset_rel_prefix %>/css/rdoc.css" rel="stylesheet">
16+
<link href="<%= h asset_rel_prefix %>/css/fonts.css" rel="stylesheet">
17+
<link href="<%= h asset_rel_prefix %>/css/rdoc.css" rel="stylesheet">
1818
<%- @options.template_stylesheets.each do |stylesheet| -%>
19-
<link href="<%= asset_rel_prefix %>/<%= File.basename stylesheet %>" rel="stylesheet">
19+
<link href="<%= h asset_rel_prefix %>/<%= File.basename stylesheet %>" rel="stylesheet">
2020
<%- end -%>

lib/rdoc/generator/template/darkfish/_sidebar_pages.rhtml

+3-3
Original file line numberDiff line numberDiff line change
@@ -12,18 +12,18 @@
1212
<%- end.each do |n, files| -%>
1313
<%- f = files.shift -%>
1414
<%- if files.empty? -%>
15-
<li><a href="<%= rel_prefix %>/<%= f.path %>"><%= h f.page_name %></a>
15+
<li><a href="<%= rel_prefix %>/<%= h f.path %>"><%= h f.page_name %></a>
1616
<%- next -%>
1717
<%- end -%>
1818
<li><details<% if dir == n %> open<% end %>><summary><%
1919
if n == f.page_name
20-
%><a href="<%= rel_prefix %>/<%= f.path %>"><%= h n %></a><%
20+
%><a href="<%= rel_prefix %>/<%= h f.path %>"><%= h n %></a><%
2121
else
2222
%><%= h n %><% files.unshift(f)
2323
end %></summary>
2424
<ul class="link-list">
2525
<%- files.each do |f| -%>
26-
<li><a href="<%= rel_prefix %>/<%= f.path %>"><%= h f.page_name %></a>
26+
<li><a href="<%= rel_prefix %>/<%= h f.path %>"><%= h f.page_name %></a>
2727
<%- end -%>
2828
</ul></details>
2929
<%- end -%>

lib/rdoc/generator/template/darkfish/js/darkfish.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ function hookSearch() {
5454
var html = '';
5555

5656
// TODO add relative path to <script> per-page
57-
html += '<p class="search-match"><a href="' + index_rel_prefix + result.path + '">' + this.hlt(result.title);
57+
html += '<p class="search-match"><a href="' + index_rel_prefix + this.escapeHTML(result.path) + '">' + this.hlt(result.title);
5858
if (result.params)
5959
html += '<span class="params">' + result.params + '</span>';
6060
html += '</a>';

lib/rdoc/generator/template/darkfish/js/search.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ Search.prototype = Object.assign({}, Navigation, new function() {
101101
}
102102

103103
this.escapeHTML = function(html) {
104-
return html.replace(/[&<>]/g, function(c) {
104+
return html.replace(/[&<>"`']/g, function(c) {
105105
return '&#' + c.charCodeAt(0) + ';';
106106
});
107107
}

lib/rdoc/generator/template/darkfish/table_of_contents.rhtml

+2-2
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,14 @@
88
<ul>
99
<%- simple_files.sort.each do |file| -%>
1010
<li class="file">
11-
<a href="<%= file.path %>"><%= h file.page_name %></a>
11+
<a href="<%= h file.path %>"><%= h file.page_name %></a>
1212
<%
1313
# HACK table_of_contents should not exist on Document
1414
table = file.parse(file.comment).table_of_contents
1515
unless table.empty? then %>
1616
<ul>
1717
<%- table.each do |heading| -%>
18-
<li><a href="<%= file.path %>#<%= heading.aref %>"><%= heading.plain_html %></a>
18+
<li><a href="<%= h file.path %>#<%= heading.aref %>"><%= heading.plain_html %></a>
1919
<%- end -%>
2020
</ul>
2121
<%- end -%>

test/rdoc/test_rdoc_generator_darkfish.rb

+23
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,29 @@ def test_generated_method_with_html_tag_yield
233233
assert_includes method_name, '{ |%&lt;&lt;script&gt;alert(&quot;atui&quot;)&lt;/script&gt;&gt;, yield_arg| ... }'
234234
end
235235

236+
def test_generated_filename_with_html_tag
237+
filename = '"><em>should be escaped'
238+
begin # in @tmpdir
239+
File.write(filename, '')
240+
rescue SystemCallError
241+
# ", <, > chars are prohibited as filename
242+
return
243+
else
244+
File.unlink(filename)
245+
end
246+
@store.add_file filename
247+
doc = @store.all_files.last
248+
doc.parser = RDoc::Parser::Simple
249+
250+
@g.generate
251+
252+
Dir.glob("*.html", base: @tmpdir) do |html|
253+
File.read(File.join(@tmpdir, html)).scan(/.*should be escaped.*/) do |line|
254+
assert_not_include line, "<em>", html
255+
end
256+
end
257+
end
258+
236259
def test_template_stylesheets
237260
css = Tempfile.create(%W'hoge .css', Dir.mktmpdir('tmp', '.'))
238261
File.write(css, '')

0 commit comments

Comments
 (0)