当前位置: 首页 > 面试题库 >

Rails CSRF Protection + Angular.js:protect_from_forgery让我注销POST

司寇灵均
2023-03-14
问题内容

如果protect_from_forgery在application_controller中提到了该选项,那么我可以登录并执行任何GET请求,但是在第一个POST请求上,Rails重置了会话,这使我注销。

protect_from_forgery暂时关闭了该选项,但希望将其与Angular.js一起使用。有什么办法吗?


问题答案:

我认为从DOM读取CSRF值不是一个好的解决方案,这只是一种解决方法。

这是angularJS官方网站http://docs.angularjs.org/api/ng.$http的文档格式 :

由于只有在您的域上运行的JavaScript才能读取Cookie,因此可以确保您的服务器XHR来自在您的域上运行的JavaScript。

要利用此优势(CSRF保护),您的服务器需要在第一个HTTP GET请求上的名为XSRF-
TOKEN的JavaScript可读会话cookie中设置令牌。在后续的非GET请求上,服务器可以验证Cookie是否与X-XSRF-TOKEN
HTTP标头匹配

这是基于这些说明的我的解决方案:

首先,设置cookie:

# app/controllers/application_controller.rb

# Turn on request forgery protection
protect_from_forgery

after_action :set_csrf_cookie

def set_csrf_cookie
  cookies['XSRF-TOKEN'] = form_authenticity_token if protect_against_forgery?
end

然后,我们应该在每个非GET请求上验证令牌。
由于Rails已经使用类似的方法构建,因此我们可以简单地重写它以附加我们的逻辑:

# app/controllers/application_controller.rb

protected

  # In Rails 4.2 and above
  def verified_request?
    super || valid_authenticity_token?(session, request.headers['X-XSRF-TOKEN'])
  end

  # In Rails 4.1 and below
  def verified_request?
    super || form_authenticity_token == request.headers['X-XSRF-TOKEN']
  end


 类似资料:
  • 它给出: 下面是我使用的代码: 方法verifyUserExistance是; 我就是这样处理注销的;

  • 问题内容: 我正在考虑为我的应用程序使用OAuth2。我尝试实现的体系结构如下: 我将拥有自己的(仅此)授权服务器 一些资源应用程序使用授权服务器验证对资源的访问 某些客户端应用程序(网络,移动设备)会将用户重定向到授权服务器进行身份验证,如果成功,则会在资源应用程序上使用api。 到目前为止,我已经成功实现了3个基本应用程序(1个身份验证服务器,1个资源服务器和1个客户端)之间的交互。我无法正常

  • 问题内容: 是否可以检测PC何时注销。我需要开发一个应用程序,在PC注销之前,该应用程序将有关注销时间的文本文档写入文本。 问题答案: 对于.NET,请参见以下问题:[c#中是否有方法可以检测Windows关闭/注销并取消该操作(询问用户之后)http://codingdict.com/questions/159553)

  • 我在Spring Security上遇到了麻烦。我可以登录但不能注销(至少不是按预期)。 登录后,我将被重定向到/secure/home.xhtml 这里是迄今为止的代码: 索引.xhtm spring-security.xhtml, http conf 这是我试图在stackoverflow上实现有关其他答案的注销的方式: 但这两个链接都不起作用。我得到了404。我还读到你应该替换请求。带有pa

  • 我在ADFS上有saml。一切正常,但我有不止一个依赖方的信任。然后,当我登录到我的一个webapp(信赖方信任)并注销时,一切都很好。 但当我登录到第一个web应用程序,然后再登录到第二个web应用程序时,我可以在ADF上使用cookie:samleSession,它结合了两个会话,然后当我从第一个web应用程序注销时,我会重定向到第二个web应用程序上的注销页面,并且不会删除网站1上的cook