从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文件需要提交,于是便提交了,然而同事 ...
随机推荐
- nginx 认证访问web
htpasswd -c /usr/local/nginx/passwd.db huo nginx .conf文件添加↓:
- Windows使用filezilla搭建FTP服务器
参考:https://segmentfault.com/a/1190000009033181 下载软件https://filezilla-project.org/ 安装过程不详述,默认安装即可 启动软 ...
- SmartSprites 智能批量合并 CSS 雪碧图
做前端的稍微有点经验的都知道 可以通过合并小图片 来减少请求数, 最早可能都是通过 fw.ps 等工具来手动合并, 这种方式的缺点就不吐槽了,效率低,可维护性差 等等 .... 一些很厉害的人,往往会 ...
- MySQL 慢查询日志工具之pt-query-digest
1. 工具简介 pt-query-digest是用于分析mysql慢查询的一个工具,它可以分析binlog.General log.slowlog,也可以通过SHOWPROCESSLIST或者通过tc ...
- Ubuntu下安装Nginx详细步骤
Nginx安装之前需要三个支持: 模块依赖性 ①gzip 模块需要 zlib 库 ②rewrite 模块需要 pcre 库 ③ssl 功能需要 openssl 库 预先编译好的包: sudo apt- ...
- 人人网张铁安:Feed系统架构分析(转)
原文:http://www.csdn.net/article/2010-07-26/277273 继成功举办首期TUP活动后,日前在北京丽亭华苑酒店鸿运二厅,由CSDN和<程序员> 杂志联 ...
- Jscript运行时错误:没有权限
问题:我在页面A中放了一个iframe ,然后在iframe 的子页面中调用主页面中的JavaScript函数,结果报错Jscript运行时错误:没有权限 原因有2: 1. 是逻辑错误,比如先关闭了i ...
- Day03 javascript详解
day03 js 详解 JavaScript的基础 JavaScript的变量 JavaScript的数据类型 JavaScript的语句 JavaScript的数组 JavaScript的函数 Ja ...
- 使用JAVA实现语音朗读一段文本
需要做的工作: 1.下载 jacob-1.17-M2 或 jacob-1.18 2.解压jacob-1.17-M2 或 jacob-1.18 3.向工程里导入jacob.jar 4.将 jacob- ...
- php://input、$_POST与$GLOBALS['HTTP_RAW_POST_DATA']三者的区别
$_POST 只有Coentent-Type的值为application/x-www.form-urlencoded和multipart/form-data两种类型时,$_POST才能获取到数据. $ ...