gpt4 book ai didi

ruby-on-rails - 当您知道用户名和密码时,通过反 CSRF 将用户登录到站点

转载 作者:行者123 更新时间:2023-12-03 14:30:34 24 4
gpt4 key购买 nike

这听起来有点邪恶,但请耐心等待。即使有问题的两个站点使用 Rails,它也不是专门的 Rails 问题。 (对这两件事提前道歉)

想象两个都使用 Ruby on Rails 的网站:

  • mysite.com,我是开发人员,在更改代码等方面拥有完全访问权限,并且还拥有管理员登录名,因此我可以管理用户帐户。
  • 他们的site.com,我有一个管理员登录但没有开发访问权限。我认识运营它的人,但出于政治原因,我宁愿不向他们寻求任何帮助。然而,这是一种选择。

  • 在每个站点上使用我的管理员登录,我为同一个人创建了一个用户帐户。当他们登录 mysite.com 时,我希望能够提供一个按钮,将他们直接登录到 theirsite.com。我将他们的用户名和密码存储在 mysite.com 数据库中的用户记录中,以方便进行此操作。该按钮是一个表单的提交按钮,它复制了 theirsite.com 登录页面上的表单,其中隐藏了用户名和密码的字段。

    绊脚石是他们的site.com 使用 authenticity_token 处理CSRF。变量,当登录名从 mysite.com 提交时验证失败。

    我第一次尝试解决这个问题是,在 mysite.com Controller 中加载表单页面,抓取他们的站点.com 登录页面以获取真实性 token ,然后将其插入到我的表单中。但这不起作用。

    如果我在两个浏览器选项卡中加载了 theirsite.com 登录页面和带有远程登录按钮的 mysite.com 页面,并手动将真实性 token 从 theirsite.com 表单复制到 mysite.com 表单,那么它就可以工作了。这是因为(我认为)authenticity_token 通过 cookie 链接到我的 session ,并且当我在同一个浏览器中执行所有操作时, session 匹配,但是当我通过抓取从 theirsite.com 获取真实性 token 时(使用 Nokogiri 但是我可以使用 curl 代替)这不是同一个 session 。

    问题 A)所以,我认为我还需要设置一个 cookie,以便 session 在浏览器和我发出的 Nokogiri 请求之间匹配。但是,这可能是不可能的,而这正是反 CSRF 系统旨在击败的那种事情。是这样吗?

    问题 B) 假设我决定,尽管存在政治问题,但我需要要求 theirsite.com 的所有者进行一些小改动,以便在我们知道他们的 theirsite.com 用户名和密码时允许我将用户登录到 theirsite.com .我可以要求他们做出的最小、最安全的改变是什么?

    请随意说“下车,你这个邪恶的黑帽”,我认为这是一个有效的回应。这个问题有点狡猾。

    最佳答案

    A) 不,这是不可能的,因为 CSRF 保护仅用于防止此类操作。所以“下车,所以你这个邪恶的黑帽子

    根据问题,我假设他们的site.com 正在使用 Rails(v3 或 v4)

    B) 您可以要求他们做的最小更改是为您执行特殊操作,以便您可以从后端传递用户凭据,并且用户将从其登录。

    该操作将像这样工作:

    您将拥有一个特殊的代码,该代码将与凭据一起传递,以便在他们的服务器上验证请求。该代码可以是静态的预定义代码,也可以在两个站点上使用相同的算法以分钟/小时/天为基础生成。

    您要求为您制作的功能将是这样的:

    Rails v3 和 v4:

    此操作将仅用于 POST。

    #I'm supposing 'protect_from_forgery' is already done in theirsite.com
    class ApplicationController < ActionController::Base
    protect_from_forgery
    end

    #changes to be made are here as follows
    class SomeController < ApplicationController
    skip_before_filter :verify_authenticity_token, only: [:login_outside] #this turns off CSRF protection on specific actions

    def login_outside
    if(#check special code here)
    #Their login logic here
    end
    end
    end

    检查此链接以获取有关在 Rails 中跳过 CSRF 保护的更多信息

    Rails 4 RequestForgeryProtection

    关于ruby-on-rails - 当您知道用户名和密码时,通过反 CSRF 将用户登录到站点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25055330/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com