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 ...
随机推荐
- updatepanel的用法之triggers
triggers有的两种触发器asyncpostbacktrigger和postbacktrigger.asyncpostbacktrigger(异步回调触发器):局部刷新,只刷新updatepane ...
- 苹果新政,禁止开发者在App中加入检查更新功能
今天妥妥的被拒了,苹果更新了新政策,不能在应用中出现检测更新的功能.AppStore会自动提醒用户更新. 去掉更新按钮,之后再尝试下看能通过不能
- sublime text There are no packages 解决!
1.问题如下图 解决如下: 1.取得sublime.wbond.net的IPv4地址.在命令提示符中输入以下命令: ping sublime.wbond.net 获得 pv 4 ip 2.C ...
- c++builder向c#开发的webservice传递非数字参数
一.引用WebService地址 BCB6.0环境下,File-New-Other-WebService-WSDL Importer.然后手动写完整地址.如:“http://192.168.1.3:1 ...
- PS抠图神器:KNOCKOUT 2.0
从优设上转载~~太好用了,保存下来以备不时之需. 本人亲身实践~~先看使用成果~~哈哈~~ 原版图 : 抠过的图: 主要看飘逸的发丝~~~而且全程操作不超过5分钟!! 下载地址: http://vdi ...
- 简单选择排序(Simple Selection Sort)的C语言实现
简单选择排序(Simple Selection Sort)的核心思想是每次选择无序序列最小的数放在有序序列最后 演示实例: C语言实现(编译器Dev-c++5.4.0,源代码后缀.cpp) 原创文章, ...
- C# Attribute
Attribute 是C#非常重要的一块内容,需要研究一下. Attribute 的简单使用:简而言之,就是可以自定义通用标志位,而不是在每个所需的类型中分别增加标志位. //class专用attr ...
- 『Python』 ThreadPool 线程池模板
Python 的 简单多线程实现 用 dummy 模块 一句话就可以搞定,但需要对线程,队列做进一步的操作,最好自己写个线程池类来实现. Code: # coding:utf-8 # version: ...
- C#程序设计基础——常量
C#程序设计基础——常量 常量是在编译时已知,并且在程序的生存期内不发生更改的不可变值.常量使用const修饰符进行声明. 常量必须在声明时初始化,且常量的类型必须为以下类型之一:sbyte/byte ...
- Circular placeholder reference 'server.port' in property definitions
Exception in thread "main" java.lang.IllegalArgumentException: Circular placeholder refere ...