我如何消毒进入Sinatra应用程序的所有参数?

时间:2015-12-10 05:18:31

标签: json hash sinatra jruby sanitize

在类似的Rails应用程序中,我能够创建一个递归Hash-checking函数,然后运行Sanitize gem的clean / fragment方法从传入的params散列中删除任何HTML元素。我在application_controller中使用了一个前置过滤器,所以一切都在应用程序范围内被清除(这是一个很棒的应用程序)。

背景故事:XSS攻击是可能的,特别是在IE浏览器中,但实际上我们只是不希望这些东西被保存到数据库中。虽然最终目标是JSON输出不包含它。

我试图在Sinatra应用程序中执行相同的操作(其中捆绑了一些ActiveSupport和JRuby ActiveRecord),但是Sanitize gem不会捆绑,因为这个特定的应用程序在JRuby中运行有一些数据库原因。 Sanitize需要Nokogiri,而Nokogiri又需要Nokogumbo,后者不会在这个JRuby环境中构建。

所以我尝试使用Rack :: Util的内置html转义方法在app.rb中做一个前置过滤器,但这会炸毁应用程序。

有没有其他方法可以考虑

1)将所有传入的参数消毒到(JRuby)Sinatra应用程序

如果没有,则选择较小的选项:

2)使所有被解析的JSON清理所述JSON属性值列表中的值?

PS - 这里的部分问题是,包含处理大量参数并进行JSON渲染的包含的本地gem证明无法调试。我将在主机应用程序和本地链接的宝石中包含Pry,当我尝试撬入宝石时,我无法查看params散列(它只显示为空) - 似乎是一个问题范围。

2 个答案:

答案 0 :(得分:1)

  

Sanitize gem不会捆绑,因为这个特定的应用程序由于某些数据库原因在JRuby中运行。 Sanitize需要Nokogiri,后者又需要Nokogumbo,而后者只是在这个JRuby环境中不会建立。

当Nokogiri在JRuby中工作(具有-java特定的宝石)时,

似乎是错误的,试试bundle update nokogiri以便让Sanitize很好地玩...

  

所以我尝试使用Rack :: Util内置的html转义方法在app.rb中进行前置过滤,但这会炸毁应用程序。

再次,太糟糕了。也许发布你的宝石版本的细节和你遇到的失败。虽然我认为首选的选择是获得在JRuby下工作的MRI工作 - 因此我会再次尝试使用Nokogiri。

答案 1 :(得分:0)

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

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

可以找到escape_html的文档here