zoukankan      html  css  js  c++  java
  • 从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。

  • 相关阅读:
    moviepy音视频剪辑:视频基类VideoClip子类VideoFileClip、CompositeVideoClip、ImageSequenceClip介绍及使用案例
    moviepy执行TextClip.search方法时报错TypeError: a bytes-like object is required, not str
    python学习接口测试(二)
    python 接口测试(一)
    接口测试学习
    python 将表格多个列数据放到同一个单元格中
    python对表格的使用
    python 下实现window 截图
    python selenium 下拉框
    selenium+chrome下载文件,格式怎么选择???
  • 原文地址:https://www.cnblogs.com/chentianwei/p/9300040.html
Copyright © 2011-2022 走看看