我的应用程序允许用户输入任何语言的代码(python,c,java,ruby等),并使用PrismJS作为语法高亮显示。 rails是否处理xss和inject,还是需要进一步清理/验证代码?
安全处理用户输入代码的正确方法是什么(如stackoverflow)?
<div class="form-group">
<label>Code Snippet</label>
<%= f.text_area :body, class: "end-field form-control", placeholder: "", rows: 8 %>
</div>
<pre><code class="language-<%= snippet.language %> line-numbers"><%= snippet.body %></code></pre>
目前尚未进行任何消毒或验证。
答案 0 :(得分:2)
OWASP (XXS prevention cheat sheet, Rule #1)建议您使用以下替换功能清理两个代码之间的代码:
& --> &
< --> <
> --> >
" --> "
' --> ' ' not recommended because its not in the HTML spec (See: section 24.4.1) ' is in the XML and XHTML specs.
/ --> / forward slash is included as it helps end an HTML entity
这是他们所说的:
规则#1适用于您希望将不受信任的数据直接放入 HTML body在某处。这包括div,p,b等内部标准标签, 大多数Web框架都有一个HTML转义的方法 字符详述如下。但是,这绝对不够 对于其他HTML上下文。您需要实施其他规则 这里也详细说明。
`<body>...ESCAPE UNTRUSTED DATA BEFORE PUTTING HERE...</body>` `<div>...ESCAPE UNTRUSTED DATA BEFORE PUTTING HERE...</div>` any other normal HTML elements
使用HTML转义以下字符 实体编码以防止切换到任何执行上下文,例如 作为脚本,样式或事件处理程序。建议使用十六进制实体 在规范中。除了XML中的5个重要字符(&amp;,&lt;,&gt;,&#34;,&#39;)之外,还包含正斜杠,因为它有助于结束HTML实体。
& --> & < --> < > --> > " --> " ' --> ' ' not recommended because its not in the HTML spec (See: section 24.4.1) ' is in the XML and XHTML specs. / --> / forward slash is included as it helps end an HTML entity
请参阅HTML实体转义和转义的ESAPI reference implementation。
String safe = ESAPI.encoder().encodeForHTML( request.getParameter("input" ) );
我的样本实施(不是确定安全)
def sanitize_inside_tags(text)
{"&"=>"amp",
"<"=>"lt",
">"=>"gt",
"\""=>"quot",
"'"=>"#x27",
"/"=>"#x2F"}.each do |char,replacement|
text = text.gsub(char,"&#{replacement};")
end
return text
end
Rails清理方法
这可能是您的最佳选择,因为它不仅是一个使用良好且经过测试的卫生库,而且还允许某些标签,例如<b>
和朋友,以便您的用户可以实际使用某些HTML标记安全。
在回答您的问题时,您可以安全地使用导轨卫生图书馆,这可能是您的最佳选择。
如果您想要删除所有代码或允许更少的代码,您可以查看custimization here。
语法Hilighting
正如@ImranAli在评论中建议的那样,查看this post并尝试查看列出的所有库。
答案 1 :(得分:1)
您可以使用sanitize
模块中的ActionView::Helpers::SanitizeHelper
方法。
<pre>
<code class="language-<%= snippet.language %> line-numbers">
<%= sanitize(snippet.body) %></code>
</pre>
注意:为了更好看,我缩进了代码。你应该使用没有缩进。
有关详细信息:http://api.rubyonrails.org/classes/ActionView/Helpers/SanitizeHelper.html#method-i-sanitize