【问题标题】:Handling mix of HTTP and HTTPS links on a page处理页面上 HTTP 和 HTTPS 链接的混合
【发布时间】:2011-07-30 03:00:10
【问题描述】:

我的设置:Rails 3.0.9、Ruby 1.9.2

我的应用程序要求我的网站只有特定部分受 SSL 保护,其余部分不受 SSL 保护。如果有人认为这不是正常行为,请查看亚马逊。仅浏览产品时,它处于 HTTP 模式,在结帐时,它切换到 HTTPS。即使在安全结帐交易中,同一页面上还有其他几个仅 HTTP 链接。

我查看了 ssl_requirement gem 并决定不使用它,因为它不是满足我需求的完整解决方案。我最终设置了特定的 SSL 路由,例如

resources :projects do
    resources :tasks, :constraints => { :protocol => "https" }
end

在我看来,对于 HTTP 特定链接

<%= link_to 'Projects', project_url(@project, :protocol => "http") %>

并处理 HTTPS 特定链接

<%= link_to 'Task', new_project_task_url(@project, :protocol => "https") %>

我知道这不是最干净的方法,但这是我决定要做的。此设置的问题是如何在每个页面上正确设置 HTTP 和 HTTPS 链接。有一个建议的解决方案here,但它需要将 _path 批量更改为 _url,如果可能的话,我更愿意避免这种情况。解决方案涉及在

中添加此方法
application_helper.rb

module ApplicationHelper
  def url_for(options = nil)
    if Hash === options
      options[:protocol] ||= 'http'
    end
    super(options)
  end
end

所以我的问题是可以更改此方法或另一种方法以将 _path 调用更改为显式 url,以便我可以使用上述方法设置正确的协议。

【问题讨论】:

    标签: ruby-on-rails https


    【解决方案1】:

    你可以试试这个,虽然我不能 100% 确定它是否有效:

    使用来自 stackoverflow 答案的建议更改

    将此添加到 application_controll.rb:

    class ApplicationController < ActionController::Base
      def url_options
        { :host => request.host }.merge(super)
      end
    end
    

    根据Docs,即使您使用_path,它也应该添加完整的url:

    :only_path - 如果为 true,则返回相对 URL(省略协议, 主机名和端口)(默认为 true,除非指定了 :host)。

    【讨论】:

    • 感谢您的建议,但此更改适用于我试图避免的url_for。我正试图找到一种方法,不必将 _path 更改为 _url 或者我误解了你的意图。
    • 我的意图是,命名的 _path 函数可能会在设置了 :only_path 选项的情况下在后台调用 url_for,但在指定主机时会忽略 :only_path 选项。
    • 啊,好的,现在我明白了。我想知道_path 是否确实在后台调用url_for,我什至去哪里阅读_path 助手的源代码,你知道吗?有人知道吗?
    • 我试过了,但没有像我们希望的那样工作,还有其他想法吗?
    【解决方案2】:

    我的应用要求我的网站只有特定部分受 SSL 保护,其余部分不受 SSL 保护。

    这是你错误的假设。安全前提是,如果您的某些应用程序需要 SSL,那么您的所有应用程序都需要 SSL。那么正确的假设是您的整个应用程序都需要 SSL。

    如果您的应用需要 SSL,那么您应该使用像 rack-ssl 这样简单的东西,它设置 HSTS 标头并在所有响应中对 cookie 强制执行安全标志。

    【讨论】:

    • 我不同意,我认为你的假设是错误的。对于像亚马逊这样的流行电子商务网站来说,混合使用 HTTP 和 HTTPS 链接是标准行为。仅浏览产品时,它处于 HTTP 模式,在结帐时,它切换到 HTTPS。即使在安全结帐交易中,同一页面上还有其他几个仅 HTTP 链接,所以它是混合的。
    • 攻击者可以MITM产品浏览页面,将原来的HTTPS链接改写成结账的HTTP链接,MITM拦截并作为HTTPS发送到服务器。目前最好的策略是始终使用 HSTS 的 SSL:攻击者必须在第一个请求中使用 MITM 才能绕过它。
    • 我并没有说不会发生 MITM 攻击,也没有 100% 的安全性。另外,如果这是一个如此大的问题,我相信亚马逊会改变他们的整个网站以使用 HTTPS 考虑到通过他们网站的交易量。看,我很感激你的反馈,但我们同意不同意。
    猜你喜欢
    • 1970-01-01
    • 2013-03-29
    • 2011-03-01
    • 2023-02-14
    • 2019-11-25
    • 2013-04-21
    • 1970-01-01
    • 1970-01-01
    • 2020-08-18
    相关资源
    最近更新 更多