从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。

 

posted @ 2018-07-12 16:11  Mr-chen  阅读(1201)  评论(0编辑  收藏  举报