force_ssl在Rails中做了什么?

时间:2013-03-28 07:47:29

标签: ruby-on-rails ssl nginx

在之前的question中,我发现我应该设置nginx ssl终止,而不是让Rails处理加密数据。

那么为什么存在以下内容?

config.force_ssl = true

我在生产配置文件中看到这个注释。但是,如果期望nginx将处理所有ssl的东西,以便我的rails应用程序不处理加密数据那么config.force_ssl = true做什么?

如果我知道我将永远使用nginx,我是否应该将它留在生产中注释?

4 个答案:

答案 0 :(得分:70)

强制您的浏览器将HTTP重定向到HTTPS。它还将您的cookie设置为“安全”,并启用HSTS,每个都可以很好地防止SSL剥离。

即使HTTPS在“https://example.com/yourapp”针对MITM攻击保护您的应用,如果有人进入您的客户端和服务器之间,他们也可以轻松地让您访问“http://example.com/yourapp”。如果没有上述保护措施,您的浏览器将很乐意将会话cookie发送给执行MITM的人员。

答案 1 :(得分:45)

设置config.force_ssl包括ActionDispatch::SSLActionDispatch::SSL文档描述了如下功能(为了清晰起见,增加了重点):

  

请参阅包含here和ActionDispatch :: SSL here的文档。

DOCS

这个中间件在config.force_ssl = true时添加到堆栈中,并传递config.ssl_options中设置的选项。它执行三个作业来强制执行安全的HTTP请求:

  1. TLS重定向:将http://请求永久重定向到https:// 具有相同的URL主机,路径等。默认情况下启用。设置config.ssl_options 修改目标网址 (例如redirect: { host: "secure.widgets.com", port: 8080 })或设置 redirect: false要停用此功能。

  2. 安全Cookie:设置Cookie上的secure标志告诉浏览器他们 不得与http://请求一起发送。默认情况下启用。组 config.ssl_options secure_cookies: false config.ssl_options来禁用此功能。

  3. HTTP严格传输安全性(HSTS):告诉浏览器记住 此站点仅限TLS并自动重定向非TLS请求。 默认情况下启用。使用hsts: false配置config.ssl_options以禁用。 将hsts: { … }expires设置为配置HSTS:

    • 180.days:这些设置会持续多长时间。默认为 18.weeks(推荐)。符合浏览器资格的最低要求 预加载列表为subdomains
    • true:设置为true告诉浏览器应用这些设置 到所有子域名。这可以保护您的cookie免受拦截 子域上的易受攻击的站点。默认为preload
    • hsts: false:宣传此网站可能包含在浏览器中' 预加载的HSTS列表。 HSTS会在每次访问时保护您的网站除了 首先访问,因为它还没有看到你的HSTS标题。关闭这个 差距,浏览器供应商包括启用HSTS的站点的烘焙列表。 转到https://hstspreload.appspot.com以提交您的网站以供收录。 要关闭HSTS,省略标题是不够的。浏览器会记住原始的HSTS指令,直到它过期。相反,使用标头告诉浏览器立即使HSTS过期。设置hsts: { expires: 0 }exclude
    • 的快捷方式
  4. 请求可以选择退出使用config.ssl_options = { redirect: { exclude: -> request { request.path =~ /healthcheck/ } } } 的重定向:

    print ("Instructions: Enter your chosen category, animals, places, names or colors.")
    viewYourFile = input("Enter your category")
    
    category = 'animals'
    
    if category == 'animals':
        animals = open('animals.txt')
        next = animals.read(1)
        while next != "":
            animal1 = animals.read(1)
            animal2 = animals.read(2)
            animal3 = animals.read(3)
            animal4 = animals.read(4)
            animal5 = animals.read(5)
        animalList = ['animal1', 'animal2', 'animal3', 'animal4', 'animal5']
        chosenAnimal = random.choice(animalList)
        animalLetters = list(chosenAnimal)
        random.shuffle(animalLetters)
        scrambledAnimal = ' '.join(animalLetters)
        print(scrambledAnimal)
        print("Enter the correct spelling of the word")
    

答案 2 :(得分:10)

此设置通过将HTTP请求重定向到其HTTPS对应项来强制HTTPS。因此,访问http://domain.com/path的浏览器将重定向到https://domain.com/path

将设置退出将允许两种协议。

您仍然需要配置Web服务器来处理HTTPS请求。

答案 3 :(得分:3)

它强制所有与服务器的通信都被加密并使用SSL,即通过HTTPS。

当您将其包含在控制器中时,控制器只接受HTTPS请求。

有用的链接:

  1. http://api.rubyonrails.org/classes/ActionController/ForceSSL/ClassMethods.html
  2. http://rubydoc.info/docs/rails/ActionController/ForceSSL
  3. http://railscasts.com/episodes/270-authentication-in-rails-3-1?view=comments