翻译整理自: 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的更多相关文章

  1. Rails secret token bug

    ArgumentError (A secret is required to generate an integrity hash for cookie session data. Use confi ...

  2. Beef

    修改配置文件/usr/share/beef-xss/config.yaml (1)改vi beef侦听端口:    http:   port:3000(改为80) (2)与Metaspolit关联: ...

  3. facebook api之Access Tokens

    Access Tokens When someone connects with an app using Facebook Login and approves the reqest for per ...

  4. Beef安装与简单使用

    安装 Debian / Ubuntu 安装依赖 sudo apt-get update sudo apt-get install curl git curl -sSL https://raw.gith ...

  5. Ruby环境配置

    一.rvm 1.简介 rvm是一个命令行工具,可以提供一个便捷的多版本ruby环境的管理和切换. 2.安装步骤 1.新建文件:rvm-installer.sh vi rvm-installer.sh ...

  6. redis requires Ruby version >= 2.2.2.

    安装RVM 无法在服务器使用curl命令访问https域名,原因是nss版本有点旧了,yum -y update nss更新一下 yum -y update nss 新建rvm-installer.s ...

  7. rails中的session

    学rails toturial的时候,第八章一直觉得有点没吃透,后来看了两篇rails关于session和cookies源码分析的文章,cookie原理与实现(rails篇) 和session原理与实 ...

  8. Token Based Authentication in Web API 2

    原文地址:http://www.c-sharpcorner.com/uploadfile/736ca4/token-based-authentication-in-web-api-2/ Introdu ...

  9. .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 ...

随机推荐

  1. Android模拟器访问本地的localhost失败及解决方案

    在开发手机网站是,使用Android模拟器测试,在手机浏览器中输入localhost访问本地服务器失败! 原因: 在Android系统中localhost就是127.0.0.1 在Windows系统中 ...

  2. html table 知识点

    第一点就是图片在表格中不能对齐边沿的问题,这是和浏览器的渲染模式相关的,在标准模式中是不能对齐的,除非改变CSS某些样式.而在准标准模式和怪异模式中,默认就是对齐的. 这一特性在以前的表格布局时代是大 ...

  3. 完全用 GNU/Linux 工作(转)

    转自:http://www.chinaunix.net/old_jh/4/16102.html 看到一半,实在太长,但已觉得很好,转来分享一下. 完全用 GNU/Linux 工作 - 摈弃 Windo ...

  4. eclipse中如何导入jar包

    如图,首先右键点击项目,选择最下面的properties, 然后进去之后点击java build path,右边会出来4个选项卡,选择libraries, 这时候最右边会有多个选项,第一个add ja ...

  5. 实用iPhone Cydia插件

      BadgeClear(角标清除):可以清除App推送所在图标右上角出现的红色角标.在桌面长按图标后,图标开始左右摇动,再双击图标即可清除点击的图标角标.   Bitesms(短信):收费插件,具有 ...

  6. ORACLE数据库操作基本语句

    1.登陆SPL*PLUS [username/password] [@server] as [sysdba|sysoper] eg. system/password or connect sys/pa ...

  7. 关于后台数据库正常存储中文通过Ajax方式传递到前台变成问号的处理

    我的一个程序,用到的后台数据库MySql,字段是Varchar,Character Set是utf8,字段能且已经正确存储了中文. 从数据库取出信息后,在后台Java代码里Debug看到正确的中文. ...

  8. Hybrid----优秀开源代码解读之JS与iOS Native Code互调的优雅实现方案-备

    本篇为大家介绍一个优秀的开源小项目:WebViewJavascriptBridge. 它优雅地实现了在使用UIWebView时JS与ios 的ObjC nativecode之间的互调,支持消息发送.接 ...

  9. Windows消息拦截技术的应用

    Windows消息拦截技术的应用 民航合肥空管中心 周毅 一.前 言 众所周知,Windows程式的运行是依靠发生的事件来驱动.换句话说,程式不断等待一个消息的发生,然后对这个消息的类型进行判断,再做 ...

  10. perl /m

    <pre name="code" class="html">[root@backoffice01 ~]# cat a1.pl my $_=" ...