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 ...
随机推荐
- ASP.NET菜鸟之路之登录系统
背景 我是一个ASP.NET菜鸟,暂时开始学习ASP.NET,在此记录下我个人敲的代码,没有多少参考价值,请看到的盆友们为我点个赞支持我一下,多谢了. 网站介绍 根据书上的例子做了一个比较粗糙的登录例 ...
- js单条新闻向上滚动
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xht ...
- [500lines]500行代码写web server
项目地址:https://github.com/aosabook/500lines/tree/master/web-server.作者是来自Mozilla的Greg Wilson.项目是用py2写成. ...
- javascript定义变量和优先级的问题
本文链接: javascript定义变量和优先级的问题.转载请保留. 看下面的代码: if (!("aa" in window)) { alert('oh my god'); ...
- 模块化的JavaScript开发的优势在哪里
如今模块化的 JavaScript 的开发越来越火热,无论是模块加载器还是优秀的 JavaScript 模块,都是层出不穷.既然这么火,肯定是有存在的理由,肯定是解决了某些实际问题.很多没接触过模块化 ...
- MySQL存储过程带in和out参数
MySQL存储过程带in和out参数 最简单的例子: [html] mysql> DELIMITER $$ mysql> USE test $$ Database changed mysq ...
- C++ Primer 5th 第13章 拷贝控制
当一个对象的引用或者指针离开作用域时,析构函数不会执行. 构造函数有初始化部分(初始化列表)和函数体. 析构函数有析构部分和函数,但析构函数的析构部分是隐式的.
- Automatically watermark all uploaded photos (给所有上传的相片加水印)
Hello, This mod automatically watermark all uploaded photos. Price: FREE, enjoy. You will have to ed ...
- 折半插入排序(Binary Insertion Sort)的C语言实现
原创文章,转载请注明来自钢铁侠Mac博客http://www.cnblogs.com/gangtiexia 折半插入排序(Binary Insertion Sort)的基本思想是将新记录插入到已经 ...
- 周赛A题
A Time Limit:2000MS Memory Limit:32768KB 64bit IO Format:%lld & %llu Description By d ...