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. Oracle数据库误删文件导致rman备份报错RMAN-06169解决办法

    Oracle数据库误删文件导致rman备份报错RMAN-06169解决办法 可能是误删文件导致在使用rman备份时候出现以下提示 RMAN-06169: could not read file hea ...

  2. java 中的& &&区别以及 C++ 中& &&的区别

    java中的 & &&两个运算符 (1).&在java中称做: 逻辑与 判断boolean类型,只有两者都是true时,才会返回true 举例: boolean b1= ...

  3. JSONUtil(JAVA对象/List与json互转,xml与json互转)

    package com.chauvet.utils.json; import java.io.BufferedReader; import java.io.File; import java.io.F ...

  4. Dolls---hdu4160(最大匹配)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4160 有n个长方体形的娃娃:当长宽高都小于另一个的时候可以放进去,每一个里面最多放一个,问最优的套法下 ...

  5. django的framework优化

    1.优化framework的性能,解决restapi调用慢的问题 ①预加载,关联查询时做缓存,序列化前简单调用setup_eager_loading ,这个需要确定sql查询调用情况(根据数据库结构确 ...

  6. Day22 文件上传下载和javaMail

    day22总结 文件上传概述   1 文件上传的作用 例如网络硬盘!就是用来上传下载文件的. 在智联招聘上填写一个完整的简历还需要上传照片呢.   2 文件上传对页面的要求 上传文件的要求比较多,需要 ...

  7. hdu 5056 Boring count (窗体滑动)

    You are given a string S consisting of lowercase letters, and your task is counting the number of su ...

  8. Java-idea-FindBugs、PMD和CheckStyle对比

    一.对比 工具 目的 检查项 备注 FindBugs 检查.class 基于Bug Patterns概念,查找javabytecode (.class文件)中的潜在bug 主要检查bytecode中的 ...

  9. JAVA 线程状态转换

    Thread类中State枚举定义: public enum State { /** * Thread state for a thread which has not yet started. */ ...

  10. Bootstrap抽样(自展法)

    Bootstrap又称自展法,是用小样本估计总体值的一种非参数方法,在进化和生态学研究中应用十分广泛.例如进化树分化节点的自展支持率等. Bootstrap的思想,是生成一系列bootstrap伪样本 ...