Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 处理用户输入的代码-安全性_Ruby On Rails_Ruby - Fatal编程技术网

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

Ruby on rails 处理用户输入的代码-安全性,ruby-on-rails,ruby,Ruby On Rails,Ruby,我的应用程序允许用户输入任何语言(python、c、java、ruby等)的代码,我使用它作为语法高亮。rails是否处理xss和注入,或者我是否需要进一步清理/验证代码 安全处理用户输入代码(如stackoverflow)的正确方法是什么 表单输入 代码片段 看法 目前未进行任何消毒或验证 输出: 您可以使用ActionView::Helpers::SanitizeHelper模块中的sanitize方法 注意:我缩进了你的代码只是为了看起来更好。您应该使用无凹痕的 有关详细信

我的应用程序允许用户输入任何语言(python、c、java、ruby等)的代码,我使用它作为语法高亮。rails是否处理xss和注入,或者我是否需要进一步清理/验证代码

安全处理用户输入代码(如stackoverflow)的正确方法是什么

表单输入

代码片段
看法
目前未进行任何消毒或验证

输出:

您可以使用
ActionView::Helpers::SanitizeHelper
模块中的
sanitize
方法



注意:我缩进了你的代码只是为了看起来更好。您应该使用无凹痕的

有关详细信息:

建议您使用以下替换项清理两个标记之间的代码:

& --> &
< --> &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
我的示例实现(不一定安全)

def sanitize_-in_标签(文本)
{“&”=>“amp”,
“”=>“gt”,
“\”=>“quot”,
“'”=>“#x27”,
“/”=>“#x2F”}。每个do|char,替换|
text=text.gsub(char,&{replacement};)
结束
返回文本
结束
Rails清理方法

这可能是您的最佳选择,因为它不仅是一个使用良好且经过测试的环境卫生库,而且还允许使用一些标记,例如
和friends,这样您的用户就可以安全地使用一些html标记

回答您的问题,是的,您可以安全地使用rails环卫库,在您的情况下,它可能是正确的选择

如果你想去掉所有标签或者减少标签的数量,你可以研究一下保管问题

语法Hilighting


正如@ImranAli在他的评论中所建议的那样,请查看并尝试查看列出的所有库。

一个相关的建议使用@ImranAli我也遇到了相同的帖子。但是coderay似乎过时了,支持的语言数量有限(与Prismj相比)。怎么样?向我们显示相关的控制器代码。我怀疑它是安全的,但需要看到控制器保存到数据库才能确定。@ScottS。它只是在表单提交时正常保存。这不起作用。例如,如果用户输入html代码,如
,则整个代码段都会被清除。我提供了一个链接获取有关其工作原理的更多详细信息。有一些选项可以自定义它。如果您查看“示例“部分,您将看到如何使用自定义洗涤器。有两种选择。有很多选项可以自定义它们。您给出的答案给出了html转义的示例。但是有没有一种可行的方法来实现所有语言的转义呢?我目前有50多种语言的输入。我需要检查每种语言的每个标记场景吗?您需要清理的唯一问题是会干扰html文档的内容。您的浏览器不会在html页面中检测并运行任意语言的代码。
<pre><code class="language-<%= snippet.language %> line-numbers"><%= snippet.body %></code></pre>
<pre>
  <code class="language-<%= snippet.language %> line-numbers">
  <%= sanitize(snippet.body) %></code>
</pre>
 & --> &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
`<body>...ESCAPE UNTRUSTED DATA BEFORE PUTTING HERE...</body>`   
`<div>...ESCAPE UNTRUSTED DATA BEFORE PUTTING HERE...</div>`

any other normal HTML elements
& --> &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
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