Understand Rails Authenticity Token
翻译整理自: http://stackoverflow.com/questions/941594/understand-rails-authenticity-token
主要翻译的是第一个回答,另外结合了下面的一些有用的评论,整理成文。
一直对authenticity-token 这东西不太理解,想想把SO看一遍也没啥用,索性还是翻译整理一下印象比较深刻。
用途:
当用户对一个表单进行 create, update, 或是删除一个资源的操作时,
rails应用会随机生成一个唯一的'鉴别权标'(authenticity token), 并将该鉴别权标存储在session中,
然后再把它放在该表单的一个隐藏区域中(hidden_field)。
当用户提交表单的时候, rails会查找鉴别权标(表单的隐藏区域里的那个),
并将它和先前存储在session中的鉴别权标想比对,
如果两者相同则用户的请求得以继续发送.
Why we need it:
既然鉴别权标是存储在session中的, 客户端也就不知道它的值.
(注: 此处客户端应该指的是在下文提到的案例中的可以运行恶意javascript代码的站点。)
这样做的好处是, 可以防止非当前rails应用表单的提交行为,也就是说为了确保客户向rails应用
发送的 POST/PUT/DELETE 请求是来自客户的浏览器, 而不是来自第三方攻击者.
假设你在使用A站点,你已经登陆到该站点了,一切正常, 接着你去使用B站点了,
你看到了一张很好看的图, 点开它想看大图。
这时候, 如果B站点上有一些恶意代码, 它可能会向A站点发送请求(因为你已经登陆了A站点),
要求删除你的账户,类似于发送请求到: http://serviceA.com/close_account.
这就是大家熟知的跨站请求伪造( CSRF, Cross Site Request Forgery )攻击。
如果A站点使用了鉴别权标的话, 这种攻击方法就失效了,
因为请求是从B服务站点发出的, 它不含有正确的鉴别权标, 请求也就不能继续发送了。
ps: 当然, 如果攻击者获取了A站点的表单的隐藏元素, 进而得到了该用户的唯一鉴别权标,
比如, hijack了你在A站点的session,这样一来, 鉴别权标就不再保护你的请求了. 这种情况是有可能发生的!
注意:
rails只会检查 POST, PUT(在rails 4 中被改为 PATCH ) 和 DELETE 请求的鉴别权标.
GET 请求是不会被检查的.为什么呢? 很简单,
因为 HTTP 规范约定了 GET 请求不能 创建, 改变, 删除服务器上的资源的.
另一方面,GET请求没必要是idempotent的( 所谓idempotent,也就是说不管你调用多少遍,得到的结果都是一样的,
具体可参考: what-is-an-idempotent-operation
注: 在数学中,该词意为等幂, 此处不知道该怎么翻译=。= )
安全也就意味着没有函数副作用。
( 函数副作用指当调用函数时, 除了返回函数值之外, 还对主调用函数产生附加的影响,
如修改全局变量或修改参数。严格的函数式语言要求函数必须无副作用.具体参考中文wiki )
idempotent意味着不管调用多少次服务,都不会累加副作用。
所有的安全服务从本质上来说都是idempotent的,因为它们没有副作用。
对当前的一个资源多次发送GET请求, 每次都可能会得到不同的结果(因为资源可能会被服务器更新),
但是它仍然是安全的, 也就是idempotent的.
ps: 上面这段翻译了好几遍,还咨询了@蕊的安, 对于翻译长了不少姿势,
不过还是不太确定,希望有朋友可以指正。原文如下:
Safe means no side-effects. Idempotent means the same side effect no matter how many time a service is called.
All safe services are inherently idempotent because there are no side effects. Calling GET on a current-time
resource multiple times would return a different result each time, but it's safe (and thus idempotent).
综上, 你应该使用鉴别权标来保护你的 POST,PUT(PATCH), DELETE 请求。
当然, 从Rails 3.0.4 版本以后, rails是默认开启 authenticity token来阻止CSRF攻击的。
想了解更多,参考: 7 security tips from Railscasts
Understand Rails Authenticity Token的更多相关文章
- Rails secret token bug
ArgumentError (A secret is required to generate an integrity hash for cookie session data. Use confi ...
- Beef
修改配置文件/usr/share/beef-xss/config.yaml (1)改vi beef侦听端口: http: port:3000(改为80) (2)与Metaspolit关联: ...
- facebook api之Access Tokens
Access Tokens When someone connects with an app using Facebook Login and approves the reqest for per ...
- Beef安装与简单使用
安装 Debian / Ubuntu 安装依赖 sudo apt-get update sudo apt-get install curl git curl -sSL https://raw.gith ...
- Ruby环境配置
一.rvm 1.简介 rvm是一个命令行工具,可以提供一个便捷的多版本ruby环境的管理和切换. 2.安装步骤 1.新建文件:rvm-installer.sh vi rvm-installer.sh ...
- redis requires Ruby version >= 2.2.2.
安装RVM 无法在服务器使用curl命令访问https域名,原因是nss版本有点旧了,yum -y update nss更新一下 yum -y update nss 新建rvm-installer.s ...
- rails中的session
学rails toturial的时候,第八章一直觉得有点没吃透,后来看了两篇rails关于session和cookies源码分析的文章,cookie原理与实现(rails篇) 和session原理与实 ...
- Token Based Authentication in Web API 2
原文地址:http://www.c-sharpcorner.com/uploadfile/736ca4/token-based-authentication-in-web-api-2/ Introdu ...
- .nil? .empty? .blank? .present? in Ruby on Rails
We get confused when there are many options to choose from. Same is the case when it comes to use an ...
随机推荐
- gephi安装好了,为何打不开?
ref: http://www.zhihu.com/question/21268129?sort=created 这个软件我自己也没有弄过,不过我同学要不会装,所以我测试地帮她装,得益于这个哥们的发的 ...
- Delphi 用ToolButton和MonthCalendar实现DateTimePicker的功能
效果图如下: 实现平台:xp xe2,其中以上功能的实现,核心主要是参考了万一老师的资料,连接:http://www.cnblogs.com/del/archive/2011/05/12/204411 ...
- POJ 2230 (欧拉路)
分析: 基础的欧拉路算法,变化在于要求每条边正向和反向各走一遍. 链式前向星构图,只要标记走过的单向边,边找边输出即可. code #include <iostream> #include ...
- python Template中substitute()的使用
在python中Template可以将字符串的格式固定下来,重复利用. Template属于string中的一个类,要使用他的话可以用以下方式调用: from string import Templa ...
- TFS使用小技巧
前述: TFS是微软自家的项目管理软件 link:TFS2012团队管理基本配置及基础使用方法 碰到的问题: 一.[高级—>获取特定版本] 今天做的一个项目,自己引用程序集出错,一直没找到解决方 ...
- MySQL 5.6.22 win32 zip版安装
mysql 5.6.22 32位下载地址:http://cdn.mysql.com//archives/mysql-5.6/mysql-5.6.22-win32.zip 1 从http://dev.m ...
- JVM笔记-temp
jvm源码分析之堆外内存完全解读 http://lovestblog.cn/blog/2015/05/12/direct-buffer/
- 状态机的c语言编程
http://blog.csdn.net/shandongdaya/article/details/7282547 一 有限状态机的实现方式 有限状态机(Finite State Machine或者F ...
- get set
关于C# get set的文章很多,但是笔者的这篇文章有它的特别之处,笔者用简单的语言把c# get set讲述的十分明了. C# get set释一:属性的访问器包含与获取(读取或计算)或设置(写) ...
- 转载:关于 Token,你应该知道的十件事
关于 Token,你应该知道的十件事 原文地址:http://alvinzhu.me/blog/2014/08/26/10-things-you-should-know-about-tokens/ 原 ...