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 ...
随机推荐
- (转)ecshop 后台商品分类添加图片的功能
转之--http://blog.sina.com.cn/s/blog_4696b3760100n5ee.html 1 .首先找到数据表 ecs_category (商品分类表) 添加一 cat_i ...
- 小试牛刀-嘿嘿,创建job了
今天 周六,我写了这个存储过程.用意:检查 数据库中是否有 该类的 job,如果有那么取job_name 赋值给 job_old, 把job_old加上时间戳 改造成 job_new.那么jo ...
- Kill Processes in Linux
Step 1: find processes to kill ps -ef | grep java Step 2: Kill the process based on process id kill ...
- [转]Java远程方法调用
Java远程方法调用,即Java RMI(Java Remote Method Invocation)是Java编程语言里,一种用于实现远程过程调用的应用程序编程接口.它使客户机上运行的程序可以调用远 ...
- [HTML5 Canvas学习]绘制矩形
1.使用strokeRect和fillRect方法绘制矩形 a.strokeRect是绘制一个不填充的矩形 b.fillRect是绘制一个填充的矩形 代码: <script> var ca ...
- ES5数组方法
先标明参考出处: http://blog.csdn.net/codebistu/article/details/8049705 本来写过一篇有关数组新方法的(详见: [转]JavaScript函数和数 ...
- [Apio2014]回文串
http://www.lydsy.com:808/JudgeOnline/problem.php?id=3676 这是一道回文树裸题,具体如何建图见http://blog.csdn.net/u0133 ...
- 001Spring4.2基本环境搭建
1:工程目录以及依赖jar包如下,如果缺少某些jar包在weblogic控制台下面会有提示 2:applicationContext.xml配置文件 <?xml version="1. ...
- Android Service之LOCATION_SERVICE
Android提供了GPS功能 LocationManager obj = (LocationManager)getSystemService(Context.LOCATION_SERVICE) Pe ...
- listView中setOnItemClickListener和getSelectedItemPosition()取不到position问题
//也可以采用通过listview 索引 取得 item 可以转化到 cursor ,pos 是在listview 的选中事件中赋值. //Cursor v2 = (Cursor) listView. ...