如何清理进入 Sinatra 应用程序的所有参数?
Posted
技术标签:
【中文标题】如何清理进入 Sinatra 应用程序的所有参数?【英文标题】:How can I sanitize all params coming into a Sinatra app? 【发布时间】:2016-03-15 15:15:40 【问题描述】:在一个类似的 Rails 应用程序中,我能够创建一个递归哈希检查函数,然后运行 Sanitize gem 的 clean/fragment 方法以从传入的参数哈希中删除任何 html 元素。我在 application_controller 中使用了 before 过滤器,因此所有内容都在应用程序范围内进行了清理(这是一个大应用程序)。
背景故事:XSS 攻击是可能的,尤其是在 IE 浏览器中,但实际上我们只是不希望任何这些东西被保存到数据库中。尽管最终目标是 JSON 输出不包含它。
我尝试在 Sinatra 应用程序(其中捆绑了一些 ActiveSupport 和 JRuby ActiveRecord)中做同样的事情,但 Sanitize gem 不会捆绑,因为由于某些数据库原因,这个特定的应用程序在 JRuby 中运行。 Sanitize 需要 Nokogiri,而后者又需要 Nokogumbo,而后者只是不会在这个 JRuby 环境中构建。
所以我尝试使用 Rack::Util 的内置 html 转义方法在 app.rb 中做一个前置过滤器,但这会使应用程序崩溃。
有没有其他的方法我可以考虑
1) 将所有传入参数清理到 (JRuby) Sinatra 应用程序中
如果不是,则选择较小的:
2) 使所有解析的 JSON 都清理所述 JSON 属性值列表中的值?
PS - 这里的部分问题是一个包含的本地 gem,它处理很多参数并进行 JSON 渲染,被证明是无法调试的。我将 Pry 包含在主机应用程序和本地链接的 gem 中,当我尝试 Pry 进入 Gem 时,我无法查看 params 哈希(它只是显示为空)——似乎有一个问题范围。
【问题讨论】:
在前置过滤器中使用Rack::Utils.escape_html
有什么问题?
【参考方案1】:
Sanitize gem 不会捆绑,因为出于某些数据库原因,这个特定的应用程序在 JRuby 中运行。 Sanitize 需要 Nokogiri,而后者又需要 Nokogumbo,而后者不会在这个 JRuby 环境中构建。
Nokogiri 在 JRuby 中工作似乎是错误的(有一个特定于 -java 的 gem),请尝试 bundle update nokogiri
以便让 Sanitize 玩得很好......
所以我尝试使用 Rack::Util 的内置 html 转义方法在 app.rb 中进行前置过滤,但这会使应用程序崩溃。
再次,太糟糕了。可能会发布有关您的 gem 版本和您遇到的故障的详细信息。虽然我相信首选的选择是让在 MRI 下工作的东西在 JRuby 下工作 - 因此我会再次尝试使用 Nokogiri。
【讨论】:
我能够让 Nokogiri 使用 JRuby 构建,但是 Sanitize gem 的 gemspec 还对 Nokogumbo 有特定的依赖关系,设置为 1.4.1 版本,并且不会使用 JRuby 构建,所以就是Sanitize gem 似乎无法成为一种选择。 你应该在这个问题上更准确:消毒需要 Nokogiri,而后者又需要 Nokogumbo,我理解错了。所以剩下的选项是构建一个 Nokogumbo 兼容的界面,例如使用“本机”Java HTML parser(编写 JRuby 扩展或使用 JRuby 的 Java 脚本集成)或按照您的尝试迁移到不同的库。两者都不是真正的 SO 答案,而是更多的真实世界编码会话:)【参考方案2】:根据 Sinatra,有 2 种很好的逃脱方式。两者都在网站上提到。 http://www.sinatrarb.com/faq.html#escape_html
1) 使用机架。该操作员提到它正在炸毁该应用程序。你能解释一下吗?同时,要使用 rack 方法,可以使用下面的代码 sn -p。清理完参数后,您就可以使用它了。
cleanedParam = Rack::Utils.escape_html(params[:some_param_name])
2) 使用 Erubis gem。宝石是用纯红宝石书写的。如下设置 erubis gem:
require 'erubis'
set :erb, :escape_html => true
完成后,您可以在输出模板时使用erubis
erb :index
【讨论】:
【参考方案3】:您可以遍历 params
哈希中的每个参数,并使用 Rack 的 escape_html
方法来转义每个参数中包含的 HTML 元素。
params.each do |p, v|
params[p] = Rack::Utils.escape_html(v)
end
escape_html
的文档可以在here 找到。
【讨论】:
以上是关于如何清理进入 Sinatra 应用程序的所有参数?的主要内容,如果未能解决你的问题,请参考以下文章