https://www.cnblogs.com/chentianwei/diary/2018/07/11/9296126.html

这篇日记记录了我遇到的invalidAuthenticaitonToken问题,以下是补充这方面的知识欠缺:

解决办法:

skip_before_action :verify_authenticity_token

或者protect_from_forgery :except => [:某个动作]

如果是api可以用protect_from_forgery unless: -> { request.format.json? }

 

ActionController::RequestForgeryProtection

讲解除了API, 在Guide中的controller和security中也有。

http://guides.rubyonrails.org/action_controller_overview.html#request-forgery-protection

http://guides.rubyonrails.org/security.html

针对伪造的请求的防护

1.避免破坏性行为: create, update, destroy要使用非GET request。 如果是RESTFUL的routes,无需注意了。

2.在请求中增加一个只有服务器才知道的令牌security token。如果没有正确的令牌,服务器拒绝访问。

Rails默认使用的token:

建立一个form。然后在chrome-inspect上看elements, 可以发现

<form action="/posts" accept-charset="UTF-8" data-remote="true" method="post">

<input name="utf8" type="hidden" value="✓">

<input type="hidden" name="authenticity_token" value="ilX2P1A/TobuXRrweoPj9sz3BDpebFVAxlsjjOYfNM7aoRM0ENmAHK5AGHi+tBzDxAiWK+bVRjtQAr5PLaflkA==">

  <!--  fields -->

</form>

Rails使用form helper增加了token。大多数时候不用担心它,但如果手动写一个表格或其他原因需要增加这个token,可以通过这个方法:form_authenticity_token。

在Rails没有自动添加令牌的地方(如Ajax)可以使用这个方法

比如是在form中手动设置ajax:参考这篇文章的第2个回答,第一个回答我尝试了,不行。

新建的Rails,都会默认使用protect_from_forgery 方法(具体参数见api)。如果安全令牌验证失效,会抛出异常:即

  invalidAuthenticaitonToken

Cross-Site Request Forgery (CSRF) 跨网页伪造请求

如何发生的:

通过一个恶意link,或什么,访问已经验证的用户才能访问的Web应用。机制是cookie中的session。只要session没有过期,攻击者就会执行未经授权的操作。

cookie会存储session id,并在服务器存储session hash。浏览器只要找到某个域名对应的cookie,就会在发生请求时,包含该cookie。

因此,假如一个请求来源于域名B网站(请求内容是删除域名A网站中的信息),浏览器也会在request时加上A网站的cookie。

例子:

小王在浏览一篇黑客发的帖子,上面有一个图像element,但实际上是一条删除命令<img src="http://www.webapp.com/project/1/destroy">

小王在www.webapp.com的session仍然是live的,因为他刚刚还在使用这个网站,并没有删除cookie。

小王在浏览黑帖时,浏览器发现这个图像元素,并尝试从webapp网站上加载图像,这时浏览器会向webapp网站发送请求并带着cookie。

webapp.com会验证cookie上的session id, 然后destroy 一个id是1的project ,然后返回结果页面。但由于非浏览器期待的结果,没有图像可以显示。

小王之后浏览webapp.com时才会发现他的project少了一条。

防范:就是上面的2条。

layout/application.rb中head中的:<%= csrf_meta_tags %>会生成安全令牌。

使用其他库调用Ajax,需要在head中添加它。

还有一些知识点,如果不使用session保存用户信息,需要手动解决。具体看这篇guide。

从invalidAuthenticationToken❌想到需要忽略:verify_authenticity_token。的更多相关文章

  1. 一个WPF小项目小结

    一:缘起 老板有做PC桌面客户端的需求,做的是能耗的计算和评估,要算能耗,就有很多环节,最后对这些环节数据进行一些简单计算.我想要是做的话就用比较熟的wpf,就去聊了下,对方给了1张比较复杂的Exce ...

  2. java.lang.IllegalArgumentException: Failed to register servlet with name 'dispatcher'.Check if there is another servlet registered under the same name

    前言 一年前接手了一个项目,项目始终无法运行,不管咋样,都无法处理,最近,在一次尝试中,终于成功处理了. 含义 意思很明显了,注册了一个相同的dispatcher,可是找了很久,没有相同的Contro ...

  3. Json Serialize 忽略特定属性

    Json Serialize 忽略特定属性 Json Serialize SerializeFilter 忽略特定属性 key words:Json Serialize jackson fastjso ...

  4. Git忽略文件方法【转】

    转自:http://www.cnblogs.com/shangdawei/archive/2012/09/08/2676669.html http://cwind.iteye.com/blog/166 ...

  5. git忽略文件【转】

    转自: http://cwind.iteye.com/blog/1666646 有很多文件不必使用git管理.例如Eclipse或其他IDE生成的项目文件,编译生成的各种目标或临时文件等.使用git ...

  6. java中如何忽略字符串中的转义字符--转载

    原文地址:http://my.oschina.net/u/1010578/blog/366252 起因     这几天工作上需要跟另一个同事联调rest接口,我这边是java他是php,返回报文是js ...

  7. 我们都忽略了Html5的力量,如果只看成一种技术就大错特错了!

    第一部分:Html5市场的力量 我们太忽略Html5的市场力量了.如果你把Html5当作一种技术,就大错特错了!忘掉你的产品,忘掉你的技术,想想移动时代的信息传播和消费场景.作为2B,我们实在是没有重 ...

  8. 容易忽略的递归当中的return

    先描述问题. 最近项目有个需求,数据入库失败后延时一定时间然后重新入库:当失败达到一定次数后就不再进行入库,因为项目简单,也不需要异步处理.所以看到这个问题很容易想到用递归去实现. 我最开始的代码ex ...

  9. .gitignore中添加的某个忽略文件并不生效

    最近项目中,来了一新同事,协同开发的过程中,发现老是提示pod install,于是照做了,做完项目可以跑成功但发现提示我跟同事一样的问题,Podfile.lock文件需要提交,于是便提交了,然而同事 ...

随机推荐

  1. SQL Server使用 LEFT JOIN ON LIKE进行数据关联查询

    这是来新公司写的第一篇文章,使用LEFT JOIN ON LIKE处理一下这种问题: SQL视图代码如下: CREATE View [dbo].[VI_SearchCN] AS --搜索产品的文件 ( ...

  2. 为什么不要使用"using namespace XXX"

    为什么不要使用"using namespace XXX" 1.避免降低性能 2.避免Entity冲突 This is not related to performance at a ...

  3. Servlet------>request和response控制编码乱码问题

    我在request篇和response都有提到,觉得会忘记,所以从新整理一下 request细节四----->通过request控制编码问题 第一种方式是通过设置------>reques ...

  4. 如何在多个LinearLayout中添加分隔线

      1.可以放置一个ImageView组件,然后将其设为分隔线的颜色或图形.分隔线View的定义代码如下:   2.在Android3.0及以上版本,LinearLayout支持直接显示分隔线. an ...

  5. python 面向对象 类 __doc__

    用来打印类的描述信息 class A1(object): '''类的描述信息''' print(A1.__doc__) # 类的描述信息

  6. mac 安装homobrew 报错解决

    按照官网(https://brew.sh/index_zh-cn.html)给的命令:     /usr/bin/ruby -e "$(curl -fsSL https://raw.gith ...

  7. LNMP简要配置

    部署LNMP环境 nginx[web服务,接收用户的请求] php [解释器] <tab> [服务] mariadb [数据库客户端] mariadb-server [数据库服务器] ma ...

  8. 入坑-DM导论-第一章绪论笔记

    //本学习笔记只是记录,并未有深入思考. 1.什么是数据挖掘? 数据挖掘是数据库中发现必不可少的一部分. 数据预处理主要包括(可能是最耗时的步骤): 1.融合来自多个数据源的数据 2.清洗数据以消除噪 ...

  9. Java多态 父类引用指向子类对象

    Java多态的三个必要条件: 1. 继承 2. 子类重写父类方法 3. 父类引用指向子类对象 然后看一个例子 输出结果为: 给出结论:Father  c  =  new  Child()    在c的 ...

  10. pyenv常用命令

    pyenv使用教程 安装 Mac brew install pyenv brew install pyenv-virtualenv 配置 echo 'eval "$(pyenv init - ...