- 浏览: 411084 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
冯大圆__渐成胡子渣:
写得很详细,想请求一下,bundler install的时候设 ...
Rails Assets Pipeline -
DaSunWarman:
...
#!/usr/bin/env 脚本解释程序的作用 -
alexag:
...
javascript立即执行函数与函数声明和函数表达式 -
houxm:
你也可以使用更简单的方式(只要在元素上添加 data-togg ...
bootstrap 小tip -
jaycongwen:
帮我看看啊,我刚学wen@wen-desktop:~$ cd ...
cannot load such file -- openssl
首先声明,本文纯属转载,链接地址:http://2015.iteye.com/blog/604377,处于对作者的尊重,将地址放到这里,本文之所以转载是因为本人认为该文章写的非常好,并达到时刻为自己的知识做储备和扩大知识范围,希望更多的朋友能够看到这篇文章,好的,下面,正文开始:
一、什么是CSRF
先看看CSRF的原文说明,如下:
Cross Site
Reference Forgery works by including malicious code or a link in a page
that accesses a web application that the user is believed to have
authenticated. If the session for that web application has not timed
out, an attacker may execute unauthorized commands.
二、CSRF案例说明和分析
自然,这里拿Rails程序来举例子说明这些问题,大家知道Rails2之
前是把session放在服务器端(文件或者DB或者缓存中),客户端在cookie中保存sessionid;而到了Rails2后,还有一种方式是把
session放在基于cookie的客户端中。当然这两样都各有道理,各有优劣。当我们向一个域名发送一个请求的时候,如果存在这个域名的
cookie,浏览器会自动把cookie附带上。这样本来没有啥问题,也是我们为了解决http无状态记录的解决方案,但是有个问题出现了,如果出现一
个到其他域名的请求,浏览器在加载的时候,也把cookie给带上了,会有什么问题?我们举个简单的也很常见的例子来说明这个问题。
1、Bob在自己的电脑上刚刚查看完自己的银行A账户余额,然后比较无聊就跑到一个公开的BBS上灌水,当他看到一篇“银行A的内部照片”的帖子,很有兴趣的打开这个帖子想看看自己信任的银行A的内部图片是啥样子的,殊不知,这其实是一个attacker精心设计的骗局。
2、在这个帖子中确实有几个图片,看上去真的像是银行A的照片,但是其中有个图片没显示出来,Bob以为是自己网速太慢,导致这个图片没有加载进来,也没在意。只是对这些并不是十分满意的照片摇摇头,就关了这个帖子。
3、几天后,Bob猛然发现自己在银行A的账户上少了1000元,到底是怎么了?
分析:
为什么钱少了呢?我们得分析一下上面这个案例,还记得当时Bob说有个图片没显示么,是的,我们来看看这个图片的地址,惊奇的发现是:<img .src="http://www.banka.com/transfer?account=myself&amount=1000&destination=attacker
">,这是一个什么地址?聪明的您一定很快就能明白,这个地址是邪恶的,看上去,他的意思是打开这个地址的人,给attacker转了1000元。
这
怎么可能?你肯定急了,我怎么能随便给一个人转1000元呢,而且我都不知道呀!但是,注意了,这其实是完全有可能的。还记得当时Bob刚刚查看完帐号信
息,基于银行A的cookie并不过期,当出现如上链接出现在src的时候(note that .src is meant to be
src),浏览器尝试着按照本地的cookie去加载上面这个URL,而银行A验证了来源请求的cookie是可以的,所以就这样事情就悄悄的发生了。
ok,
看明白了么,这就是CSRF,一句话给他下个定义就是:借你的cookie在你不知道的时候悄悄的做了一些你不愿意做的事情。这里有个更要命的是,这个包
含上述URL的图片或者链接,并不需要一定是放在银行A的服务器上,相反可以在任一地方,比如blog,公开的BBS,或者一些群发的Mail中等等,如
此多的场合下,这些都有可能存在陷阱。
三、CSRF的预防
看上去很恐怖吧,是的,确实恐怖,意识到恐怖是个好事情,这样会促使你接着往下看如何改进和防止类似的漏洞出现。
总体来说,预防CSRF主要从2个方面入手,分别是:
1、正确使用GET,POST和Cookie;
2、在non-GET请求中使用Security token;
一般,大家知道的浏览器发送请求的方式有GET或者POST,但是还有一种比较常用的是Cookie,至于其他的HTTP协议请求方式,你可以google,一般按照W3C的规范:
1、GET常用在查看,列举,展示的时候;
2、POST常用在下达订单,改变一个资源的属性或者做其他一些事情;
ok,我们这里拿Rails按照前面列举的2种预防手段做说明,首先,我们可以在Rails的控制器中(controller)将一些方法(action)限定(verify)为只能使用POST或者GET,例如:
verify :method => :post, :only => [ :transfer ], :redirect_to => { :action => :list }
恩,很好,这样做下限制以后,前面案例中的方法就失效了,因为这里我们限定了transfer必须使用POST来提交请求,当GET请求来的时候并不会被响应。
万事大吉了?NO!因为POST的请求也是可以被构造出来后自动发送的,如何实现,看下面吧,你肯定会吃惊的。
- < a .href = "http://www.1sters.com/" onclick = "var f = document.createElement('form'); f.style.display = 'none'; this.parentNode.appendChild(f); f.method = 'POST'; f.action = 'http://www.example.com/account/destroy'; f.submit();return false;" > 点我试试 </ a >
<a .href="http://www.1sters.com/" onclick="var f = document.createElement('form'); f.style.display = 'none'; this.parentNode.appendChild(f); f.method = 'POST'; f.action = 'http://www.example.com/account/destroy'; f.submit();return false;">点我试试</a>
是的,这就是一个活生生的例子(.href is meant to be href),使用link的href或者img的src都可以,再想想一个Attacher放了一个图片,然后写了一个onmouseover方法,执行上述的那段JS,如下,或者使用AJAX。
<img .src="http://www.harmless.com/img" width="400" height="400" onmouseover="…" />
所以,限定为POST后还不是非常的保险,怎么办?不急,我们还有第二步,给non-GET的请求设置security token,如何实现,在Rails2以后非常简单(也是默认的),我们只需要在environment.rb中添加如下代码:
- config.action_controller.session = {
- :session_key => '_csrf_session' ,
- :secret => 'ae4b43dda38ff78bb50898b2935da76d1e224061ab72a9399d34cea4c6178eee6dae815fff920a20642f27abda83b793da4e9b6cf20c4838805e80abf53e318a'
- }
config.action_controller.session = { :session_key => '_csrf_session', :secret => 'ae4b43dda38ff78bb50898b2935da76d1e224061ab72a9399d34cea4c6178eee6dae815fff920a20642f27abda83b793da4e9b6cf20c4838805e80abf53e318a' }
然后在application controller中包含如下security token设置:
- protect_from_forgery :secret => 'ae4b43dda38ff78bb50898b2935da76d1e224061ab72a9399d34cea4c6178eee6dae815fff920a20642f27abda83b793da4e9b6cf20c4838805e80abf53e318a'
protect_from_forgery :secret => 'ae4b43dda38ff78bb50898b2935da76d1e224061ab72a9399d34cea4c6178eee6dae815fff920a20642f27abda83b793da4e9b6cf20c4838805e80abf53e318a'
ok,基本上安全了,如果这时POST请求过去,但是security
token和session计算出来的secret和服务端的secret匹配不上的话,就会返回一个
ActionController::InvalidAuthenticityToken错误,防止该类缺陷的出现。
安全了,也许你要说,那我如果能破解出protect_from_forgery,不就OK了么,按照理论上是,但是实际破解是基本上不可能的,因为有人曾计算过,暴力破解该串大概需要2的11次方时间。
发表评论
-
ruby module :: 前置操作符
2014-04-02 16:55 755在ruby代码中,我们经常看到有类似这样的获取module的用 ... -
关于Ruby动态方法定义的区别
2014-04-02 16:05 867A.class_eval(<<-EOF, __ ... -
%Q, %q, %W, %w, %x, %r, %s
2014-04-02 10:52 1072%Q 遇到引号嵌套的时候我们往往需要使用反斜线来实现转义,使用 ... -
Ruby extend self
2013-10-22 10:14 1007我们想让实例方法同时为类方法,那么可以使用extend sel ... -
$:.unshift File.expand_path('..', __FILE__)
2013-10-22 10:05 1329一直能看到一些gem里面会有这样一句代码: $:.unshif ... -
rails cattr_accessor and mattr_accessor
2013-09-27 09:37 0http://stackoverflow.com/questi ... -
Rails、Nginx、Passenger、bundle,这几者是怎么协作的?
2013-06-27 00:33 1145注:本文转自知乎,原文请参考 Bundle是Gem包的依赖管 ... -
bundle open a specify gem
2013-06-26 23:48 1033今天在看railscasts教程http://railscas ... -
关于测试
2013-06-25 00:52 740http://asciicasts.com/episodes/ ... -
Rails高级编程 笔记
2013-04-23 18:00 0Ruby基础 1、类:主要负责封装和分离事物 2 ... -
ruby通用符号
2013-04-10 22:34 0%Q 当你在”字符串中” 有大量的使用双引号时,频繁的转义字符 ... -
rails_client_validations
2013-02-22 10:57 923看了下rails的服务端验证怎样转换到客户端,实现类似于aja ... -
rails Authration and Password
2013-02-19 18:23 1015以下是我总结的在rails项目中用到的与登录注册相关的资源: ... -
Rails Assets Pipeline
2013-02-03 18:03 7425Assets Pipeline 有什么好处 ... -
deployment RoR with nginx & unicorn on ubuntu
2013-01-09 14:50 1859本来一直都是用rails自带的webrick做本地开发的,但是 ... -
rails attr_protected、 attr_accessible
2013-01-06 10:02 1044attr_protected、 attr_accessible ... -
NewRelic
2013-01-04 17:52 6339NewRelic是一家提供Rails性能监测服务的网站, Ne ... -
rails中处理北京时间以及数据库的时区问题
2012-10-10 11:18 0解释4个时区设置的不同: config.active_rec ... -
eigenclass 与 class 关系
2012-09-20 16:24 1122声明:本文转载自http://ruanwz.github.co ... -
单例模块儿
2012-09-11 17:01 950#单例模块,存在的意义就是在模块被载入类时,给类添加类方法和创 ...
相关推荐
### 实践Rails社交网络站点开发知识点总结 #### 一、书籍基本信息 - **书名**:《实践Rails社交网络站点》 - **作者**:Alan Bradburne - **出版年份**:2007年 - **出版社**:Apress - **ISBN-13(pbk)**:978-1-...
Rails安全审核列表 0.安全宝 用于Ruby on Rails应用程序的静态分析安全漏洞扫描程序 -机架中间件,用于阻止和限制 与安全性相关的标头全部包含在一...2.跨站点脚本 确保始终防止XSS攻击。 检查代码中是否有任何html_s
在Rails中,可以使用`rack-cors` gem来处理这个问题。 6. **浏览器兼容性**:确保你的应用支持所有现代浏览器的TLS版本,因为某些旧版本的浏览器可能不支持最新的加密套件。 7. **HSTS(严格传输安全)**:启用...
4. **流量劫持**:攻击者可重定向用户到其他恶意网站,比如赌博、色情站点,或者用于分布式拒绝服务(DDoS)攻击的网站。 **三、防范措施** 1. **输入验证**:对用户提交的数据进行严格的过滤和验证,避免特殊字符...
- **CSRF**:通过验证令牌等方式防止跨站点请求伪造攻击。 ### 部署和扩展 #### 二十二、部署到生产环境的步骤 - **环境准备**:确保生产环境符合部署要求。 - **构建过程**:打包应用程序及其依赖项。 - **发布...
12. **安全性**:考虑XSS(跨站脚本攻击)、CSRF(跨站请求伪造)和SQL注入等常见Web攻击,需采取相应的防护措施,例如使用参数化查询、输入验证和HTTPS加密通信。 13. **性能优化**:通过缓存策略、CDN(内容分发...
开发者可以通过分析源代码学习如何处理用户输入、防止SQL注入、XSS攻击,并确保敏感信息的安全。 通过研究"apps.fyne.io-master"的源代码,开发者不仅可以学习如何构建类似的应用展示平台,还可以加深对Ruby on ...
源码应包含必要的安全措施,如防止SQL注入、XSS攻击、CSRF(跨站请求伪造)等。可能还集成了防火墙规则、DDoS防护和安全日志监控。 9. **部署与配置**: 用户快速搭建视频博客平台,意味着源码应提供清晰的部署...
10. **安全实践**:GitHub Pages项目通常遵循安全最佳实践,例如使用HTTPS以加密数据传输,避免XSS(跨站脚本攻击)和CSRF(跨站请求伪造)等常见的Web安全问题。 综上所述, andreacavagna01.github.io 项目涉及了...
6. **安全**:考虑到电子邮件的敏感性,项目必须实现HTTPS加密、CSRF(跨站请求伪造)防护、XSS(跨站脚本攻击)过滤等安全措施。 7. **测试**:项目可能包含单元测试、集成测试和端到端测试,以确保代码质量和功能...
通过深入了解和使用 Redmine 2.6.3,团队能够更有效地管理项目,提高工作效率,实现跨部门、跨地域的高效协同。同时,由于 Redmine 是开源软件,用户可以根据自身需求进行二次开发和定制,以满足特定业务场景。
- 输入验证防止SQL注入和跨站脚本攻击。 - 用户密码应经过哈希处理并加盐存储。 6. **SEO优化**: - Meta标签设置以提高搜索引擎可见性。 - 网站速度优化,减少加载时间。 - 结构化数据标记,利于搜索引擎理解...
- **CSRF(跨站请求伪造)和XSS(跨站脚本攻击)防护**:通过设置cookie的SameSite属性,以及验证请求头的CSRF令牌,防止这类攻击。 - **输入验证**:对用户提交的数据进行验证,防止SQL注入等安全问题。 7. **...
9. **安全考虑**:考虑到网络安全,项目可能使用HTTPS加密,以及防止SQL注入和跨站脚本攻击的安全措施。 10. **性能优化**:可能采用了CDN(内容分发网络)加速静态资源加载,或者使用Gzip压缩、HTTP缓存策略来提升...
7. **部署和托管**:"my-site"可能部署在云服务提供商如AWS、Google Cloud或Heroku上,也可能使用静态站点托管服务如Netlify或GitHub Pages。 8. **测试和调试**:开发者会用到单元测试(如Jest、Mocha)、集成测试...
9. **安全考虑**:确保网站的安全性至关重要,包括防止XSS(跨站脚本攻击)和CSRF(跨站请求伪造)等,以及使用HTTPS协议保障数据传输的安全。 10. **持续维护与更新**:网站上线后,定期更新内容、修复漏洞、优化...
2. **编程语言**:项目可能使用了各种编程语言,如JavaScript(前端开发)、Python(后端或数据处理)、Java(跨平台应用)或C++(高性能计算)。选择哪种语言取决于项目的目标和开发者的技术栈。 3. **前端技术**...