以前,我一直在使用ssl_requirement来对我们通过ssl提供哪些页面进行细粒度控制,并通过普通的http提供服务。
根据ssl_requirement自己的wiki,它已被rails 3.1的Force SSL 取代。然而,情况似乎并非如此。强制SSL似乎没有暴露出相反方向的选项,没有办法强制页面通过常规http发送。
什么是正确的Rails 3.1方式强制页面以普通的http显示? Force SSL真的取代了ssl_requirement吗?
答案 0 :(得分:26)
什么正义说。有些人强烈建议使用SSL浏览所有内容。现在窥探非SSL会话是微不足道的,所以你应该尽量容纳想要使用它的人。
然而
使用before_filter完成它应该相当容易:
class ApplicationController < ActionController::Base
before_filter do
if request.ssl? && Rails.env.production?
redirect_to :protocol => 'http://', :status => :moved_permanently
end
end
end
答案 1 :(得分:4)
强制SSL的代码非常容易阅读。
https://github.com/rails/rails/blob/master/actionpack/lib/action_controller/metal/force_ssl.rb
它似乎没有反向并强制使用http。它提供了唯一的和except选项来控制需要SSL的操作和控制器,但是没有提供强制使用HTTP而不是https的方法。
答案 2 :(得分:2)
使用force_non_ssl
与force_ssl
完全相同的方式检查此Rails关注:https://gist.github.com/joost/6989118
接受以下选项:
force_non_ssl only: :show
force_non_ssl except: :show, notice: "Hi this is now insecure :)"
答案 3 :(得分:1)
我将joost的代码简化为我需要的所有代码。谢谢joost
if request.ssl?
options = {
:protocol => 'http://',
:host => request.host,
:path => request.fullpath,
:status => :moved_permanently
}
non_secure_url = ActionDispatch::Http::URL.url_for(options.slice(*URL_OPTIONS))
redirect_to non_secure_url, options.slice(*REDIRECT_OPTIONS)
end
答案 4 :(得分:0)
对于那些只需要在像我这样的本地计算机上短时间禁用整个应用程序force_ssl
行为的用户,您只需在ApplicationController中执行此操作:
def self.force_ssl *a
warn "force_ssl disabled globally"
end
请确保不要将其提交给您的代码库。
答案 5 :(得分:-7)
为什么曾希望通过HTTPS强制使用HTTP?
我们很多人在这里浏览SSL 无处不在。请不要仅仅因为你不喜欢用自己的安全来帮助我们而让我们其他人处于危险之中。
对于我们大多数人来说,安全性非常重要,即使我们大多数人不了解其重要性或知道如何获得它。对于我们中的一些人来说,安全是生死攸关的。
某些网页必须通过SSL提供。虽然在我看来,如果您网站的任何部分需要通过SSL提供,那么整个网站需要它(MITM可以将链接更改为SSL页面它在非SSL页面上呈现,指向MITM控制的非SSL代理。没有页面永远需要使用 out SSL提供服务。