在一个类似的Rails应用程序中,我能够创建一个递归的hash检查函数,然后运行Sanitize gem的clean/fragment方法从传入的params散列中删除任何HTML元素。我在application_controller中使用了一个之前的过滤器,所以所有的东西都会在整个应用程序中被清除(这是一个很大的应用程序)。
背景: XSS攻击是可能的,特别是在IE浏览器中,但实际上我们只是不希望这些东西被保存到数据库中。尽管最终目标是JSON输出不包含它。
我试图在Sinatra的一个应用程序中做同样的事情(它捆绑了一些ActiveSupport和JRuby ActiveRecord ),但是Sanitize gem不能绑定,因为由于某些数据库的原因,这个特定的应用程序在JRuby中运行。Sanitize需要Nokogiri,而Nokogumbo又需要Nokogumbo,而Nokogumbo不会在这个JRuby环境中构建。
所以我试着用Rack::Util内置的html转义方法在app.rb中做了一个before过滤器,但这会毁了这个应用。
有没有其他我可以考虑的方法?
1)将所有传入参数清理到(JRuby) Sinatra应用程序中
如果不是,则有一个较小的选择:
2)让所有被解析的JSON都对JSON属性值列表中的值进行杀毒?
PS -这里的部分问题是一个包含的本地gem,它处理大量的参数和JSON渲染,被证明是不可能调试的。我将在主机应用程序和本地链接的gem中都包含Pry,当我试图窥探Gem时,我无法查看params散列(它只是显示为空)-there似乎是一个范围问题。
发布于 2015-12-14 19:10:46
Sanitize gem不会捆绑,因为由于某些数据库原因,这个特别的应用程序在JRuby中运行。Sanitize需要Nokogiri,而Nokogumbo又需要Nokogumbo,而Nokogumbo不会在这个JRuby环境中构建。
看起来不太对劲,因为Nokogiri在JRuby中工作(有一个特定于-java的宝石),试一下bundle update nokogiri,这样你就可以让Sanitize玩得很好……
我尝试在app.rb中使用Rack::Util的内置html转义方法做一个
过滤器,但这会毁了这个应用程序。
再说一次,太糟糕了。也许可以发布有关gem版本和遇到的失败的详细信息。虽然我认为,首选的选择是在JRuby下获得在核磁共振下工作的东西-因此我会再次尝试使用Nokogiri。
发布于 2015-12-21 10:29:51
根据Sinatra的说法,有两种好的逃脱方法。这两个都在网站上提到了。http://www.sinatrarb.com/faq.html#escape_html
1)使用机架。该行动提到,它正在炸毁应用程序。你能多解释一下吗?同时,要使用机架方法,您可以使用以下代码片段。一旦参数被清除,你就可以使用它了。
cleanedParam = Rack::Utils.escape_html(params[:some_param_name])2)使用Erubis gem。宝石是用纯红宝石写的。按如下方式设置erubis gem:
require 'erubis'
set :erb, :escape_html => true完成后,您可以在输出模板时使用erubis
erb :index发布于 2016-10-03 07:51:52
您可以遍历Rack散列中的每个参数,并使用Rack的escape_html方法来转义每个参数中包含的params元素。
params.each do |p, v|
params[p] = Rack::Utils.escape_html(v)
end可以在here中找到escape_html的文档。
https://stackoverflow.com/questions/34194222
复制相似问题