处理页面上HTTP和HTTPS链接的混合

3

我的设置: Rails 3.0.9,Ruby 1.9.2

我的应用要求只保护网站的某个部分,而其余部分不需要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链接。有一个提议的解决方案在这里,但它需要对_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,以便我可以使用上述方法设置正确的协议。
2个回答

2

虽然我不能百分之百确定它能够正常工作,但你可以尝试以下方法:

使用stackoverflow答案中提出的更改建议。

将以下内容添加到application_controll.rb文件中:

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

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

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


谢谢您的建议,但这个更改适用于我想要避免的 url_for。我正在尝试找到一种方法,不必从 _path 更改为 _url 或者可能我误解了您的意图。 - Bob
我的意图是也许命名为_path的函数将会在后台调用url_for函数,并启用:only_path选项,但当指定了一个主机时,:only_path选项将被忽略。 - sled
啊,好的,现在我明白了。我想知道 _path 是否在后台调用了 url_for,我该去哪里阅读 _path 助手的源代码呢?你知道吗?有人知道吗? - Bob
我尝试了一下,但它并没有像我们希望的那样工作,你还有其他想法吗? - Bob

0
我的应用程序要求只有网站的某个特定部分受到SSL保护,而其余部分则不受保护。
这是你错误的假设。正确的前提是,如果你的应用程序的某些部分需要SSL,则整个应用程序都需要SSL。因此,正确的假设是你的整个应用程序都需要SSL。
如果你的应用程序需要SSL,那么你应该使用像rack-ssl这样简单的东西,它设置了HSTS头,并在所有响应中强制执行cookie的安全标志。

我不同意,我认为你的假设是错误的。像亚马逊这样的流行电子商务网站混合使用HTTP和HTTPS链接是标准行为。当仅浏览产品时,它处于HTTP模式,在结账过程中,它会切换到HTTPS。即使在安全结账交易的中间,同一页上还有其他几个仅限HTTP的链接,因此它是混合的。 - Bob
1
攻击者可以使用中间人攻击方式,将产品浏览页面上原本的HTTPS链接重写为HTTP链接,并拦截并发送至服务器的HTTPS链接。目前最好的策略是始终使用SSL和HSTS:攻击者必须通过中间人攻击方式来获取第一次请求才能规避此策略。 - yfeldblum
我并没有说中间人攻击不可能发生,也不存在百分之百的安全。而且如果这是一个如此巨大的问题,我相信亚马逊会改变他们整个网站使用HTTPS,考虑到通过他们网站进行的交易量。听着,我很感激你的反馈,但让我们就同意各自的看法吧。 - Bob

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接