如何对进入Sinatra应用程序的所有参数进行清理处理?

9
在一个类似的Rails应用程序中,我能够创建一个递归的哈希检查函数,然后运行Sanitize gem的clean/fragment方法,从传入的params哈希中删除任何HTML元素。我在application_controller中使用了一个before过滤器,以便整个应用程序都可以进行清理(它是一个大型应用程序)。
背景:XSS攻击是可能的,特别是在IE浏览器中,但实际上我们根本不希望这些东西保存到数据库中。最终目标是JSON输出不包含它。
我尝试在Sinatra应用程序中做同样的事情(其中包含一些ActiveSupport和JRuby ActiveRecord),但是Sanitize gem不会捆绑,因为这个特定的应用程序由于某些数据库原因在JRuby中运行。Sanitize需要Nokogiri,而Nokogumbo又需要构建在这个JRuby环境中。所以我在app.rb中尝试使用Rack::Util的内置html转义方法来做before过滤器,但是这会导致应用崩溃。
有没有其他的思路:
1)将所有传入的参数都进行清理并进入(JRuby)Sinatra应用程序
如果不行,还有一个次选项:
2)使所有解析的JSON都对其属性-值列表中的值进行清理?
PS-问题的一部分是包含的本地gem,它处理了许多参数并进行JSON渲染,这证明是不可能调试的。我将在主机应用程序和本地链接的gem中都包含Pry,当我尝试进入Gem时,无法查看params哈希(它只显示为空)-似乎存在作用域问题。

在 before 过滤器中使用 Rack::Utils.escape_html 的问题是什么? - matt
3个回答

1
由于某些数据库原因,这个特定的应用程序在JRuby中运行,因此Sanitize gem无法捆绑。Sanitize需要Nokogiri,而Nokogiri又需要Nokogumbo,在这个JRuby环境中后者就无法构建。似乎是错误的,因为Nokogiri可以在JRuby中工作(有一个-java特定的gem),尝试使用bundle update nokogiri让Sanitize正常工作。所以我尝试在app.rb中使用Rack :: Util内置的html转义方法进行前过滤器,但这会炸掉应用程序。再次尝试使用Nokogiri是首选,我相信它能够在JRuby下工作,因此建议您再次尝试使用Nokogiri,并在失败时发布有关Gem版本和故障的详细信息。

我能够让Nokogiri在JRuby上构建,但是Sanitize gem的gemspec也具有特定依赖于Nokogumbo 1.4.1版本,而该版本无法在JRuby上构建,因此这就是Sanitize gem似乎无法使用的原因。 - rcd
你在问题中应该更准确:Sanitize 需要 Nokogiri,而 Nokogiri 又需要 Nokogumbo,我误解了它。所以剩下的选项是构建一个兼容 Nokogumbo 的接口,例如使用“本地”Java HTML 解析器(编写 JRuby 扩展或使用 JRuby 的 Java 脚本集成),或者迁移到不同的库,就像你尝试的那样。 两者都不是真正的 SO 答案,而更多是实际的编程会话 :) - kares

0

您可以遍历params哈希表中的每个参数,并使用Rack的escape_html方法来转义每个参数中包含的HTML元素。

params.each do |p, v|
  params[p] = Rack::Utils.escape_html(v)
end

escape_html 的文档可以在 这里 找到。


0

根据Sinatra的说法,有两种很好的转义方式。这两种方式都在网站上提到了。http://www.sinatrarb.com/faq.html#escape_html

1)使用Rack。楼主提到它会使应用程序崩溃。你能否解释得更详细一些?同时,要使用rack方法,您可以使用以下代码片段。一旦参数已被清理,您就可以使用它。

cleanedParam = Rack::Utils.escape_html(params[:some_param_name])

2) 使用 Erubis gem。这个 gem 是用纯 Ruby 编写的。按照以下步骤设置 erubis gem:

require 'erubis'
set :erb, :escape_html => true

一旦完成这个步骤,你就可以在输出模板时使用 erubis。
erb :index

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接