处理用户输入的代码 - 安全性

时间:2016-05-19 21:26:59

标签: ruby-on-rails ruby

我的应用程序允许用户输入任何语言的代码(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>

目前尚未进行任何消毒或验证。

输出:

enter image description here

2 个答案:

答案 0 :(得分:2)

OWASP (XXS prevention cheat sheet, Rule #1)建议您使用以下替换功能清理两个代码之间的代码:

 & --> &amp;
 < --> &lt;
 > --> &gt;
 " --> &quot;
 ' --> &#x27;     &apos; not recommended because its not in the HTML spec (See: section 24.4.1) &apos; is in the XML and XHTML specs.
 / --> &#x2F;     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实体。

& --> &amp;
< --> &lt;
> --> &gt;
" --> &quot;
' --> &#x27;     &apos; not recommended because its not in the HTML spec (See: section 24.4.1) &apos; is in the XML and XHTML specs.
/ --> &#x2F;     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