从invalidAuthenticationToken❌想到需要忽略:verify_authenticity_token。
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。的更多相关文章
- 一个WPF小项目小结
一:缘起 老板有做PC桌面客户端的需求,做的是能耗的计算和评估,要算能耗,就有很多环节,最后对这些环节数据进行一些简单计算.我想要是做的话就用比较熟的wpf,就去聊了下,对方给了1张比较复杂的Exce ...
- java.lang.IllegalArgumentException: Failed to register servlet with name 'dispatcher'.Check if there is another servlet registered under the same name
前言 一年前接手了一个项目,项目始终无法运行,不管咋样,都无法处理,最近,在一次尝试中,终于成功处理了. 含义 意思很明显了,注册了一个相同的dispatcher,可是找了很久,没有相同的Contro ...
- Json Serialize 忽略特定属性
Json Serialize 忽略特定属性 Json Serialize SerializeFilter 忽略特定属性 key words:Json Serialize jackson fastjso ...
- Git忽略文件方法【转】
转自:http://www.cnblogs.com/shangdawei/archive/2012/09/08/2676669.html http://cwind.iteye.com/blog/166 ...
- git忽略文件【转】
转自: http://cwind.iteye.com/blog/1666646 有很多文件不必使用git管理.例如Eclipse或其他IDE生成的项目文件,编译生成的各种目标或临时文件等.使用git ...
- java中如何忽略字符串中的转义字符--转载
原文地址:http://my.oschina.net/u/1010578/blog/366252 起因 这几天工作上需要跟另一个同事联调rest接口,我这边是java他是php,返回报文是js ...
- 我们都忽略了Html5的力量,如果只看成一种技术就大错特错了!
第一部分:Html5市场的力量 我们太忽略Html5的市场力量了.如果你把Html5当作一种技术,就大错特错了!忘掉你的产品,忘掉你的技术,想想移动时代的信息传播和消费场景.作为2B,我们实在是没有重 ...
- 容易忽略的递归当中的return
先描述问题. 最近项目有个需求,数据入库失败后延时一定时间然后重新入库:当失败达到一定次数后就不再进行入库,因为项目简单,也不需要异步处理.所以看到这个问题很容易想到用递归去实现. 我最开始的代码ex ...
- .gitignore中添加的某个忽略文件并不生效
最近项目中,来了一新同事,协同开发的过程中,发现老是提示pod install,于是照做了,做完项目可以跑成功但发现提示我跟同事一样的问题,Podfile.lock文件需要提交,于是便提交了,然而同事 ...
随机推荐
- Code Forces 18D Seller Bob(简单DP)
D. Seller Bob time limit per test 2 seconds memory limit per test 128 megabytes input standard input ...
- Hibernate的状态,缓存和映射
Hibernate的状态,缓存和映射 1.对象的状态 1.1.对象状态的概念和分类 在使用Hibernate操作数据库的时候,我们先创建了JavaBean对象,然后使用session来保存或者更新到数 ...
- Oracle 11gR2 RAC监听器原理介绍
一.基本概念 oracle11gR2 RAC开始引入scan概念,一般通过dns服务器或gns服务器解析scan,也可以使用/etc/hosts文件解析scan,只不过oracle官方不建议这样做,h ...
- 新一代Java模板引擎Thymeleaf
新一代Java模板引擎Thymeleaf-spring,thymeleaf,springboot,java 相关文章-天码营 https://www.tianmaying.com/tutorial/u ...
- talib 中文文档(九):Volume Indicators 成交量指标
Volume Indicators 成交量指标 AD - Chaikin A/D Line 量价指标 函数名:AD 名称:Chaikin A/D Line 累积/派发线(Accumulation/Di ...
- kubernetes实战(十):k8s使用Helm安装harbor
1.基本概念 对于复杂的应用中间件,需要设置镜像运行的需求.环境变量,并且需要定制存储.网络等设置,最后设计和编写Deployment.Configmap.Service及Ingress等相关yaml ...
- python修改镜像源
pip升级:python -m pip install --upgrade pip https://www.cnblogs.com/andy9468/p/10319442.html 1.在命令中临时修 ...
- 0702-spring cloud config-git仓库配置、用户授权
一.概述 参看地址:https://cloud.spring.io/spring-cloud-static/Edgware.SR3/single/spring-cloud.html#_environm ...
- (转) SpringBoot非官方教程 | 第二十四篇: springboot整合docker
这篇文篇介绍,怎么为 springboot程序构建一个Docker镜像.docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源.Docker 可以让开发者打包他们的 ...
- PAT 1060 Are They Equal[难][科学记数法]
1060 Are They Equal(25 分) If a machine can save only 3 significant digits, the float numbers 12300 a ...