如何将 SameSite 属性设置为“无”;在 Rails3.1.12 和 Ruby1.9.3 中安全

Sur*_*mar 12 ruby ruby-on-rails ruby-1.9.2 ruby-on-rails-3.1 ruby-1.9.3

https://example.com/上的跨站点资源关联的 cookie设置为没有该SameSite属性。它已被阻止,因为 Chrome 现在仅在设置了SameSite=None和 的情况下才提供具有跨站点请求的 cookie Secure。您可以在应用程序>存储>Cookies 下的开发人员工具中查看 cookie,并在https://www.chromestatus.com/feature/5088147346030592https://www.chromestatus.com/feature/5633521622188032 上查看更多详细信息。

请告诉我如何设置 SameSite cookie 属性。提前致谢。

Kel*_*nan 8

在 Rails 6.0 和 6.1 中same_site添加属性

cookies["foo"] = {
  value: "bar",
  secure: Rails.application.config.secure_cookies,
  same_site: "None"
}
Run Code Online (Sandbox Code Playgroud)

对于 Rails 5.x 及更低版本,rails_same_site_cookiegem 是添加SameSite=None;到所有应用程序 cookie的不错选择。它使用中间件来做到这一点。

  • 设置 `cookies["foo"] = {value: "bar", same_site: :none, secure: true}` 在 Rails 5.2.3 中对我有用,尽管显然 [you need Rack >= 2.1.0](https: //github.com/rails/rails/pull/28297#issuecomment-600566751) (2认同)

Alo*_*ain 7

设置自定义标题的方法是将以下行添加到您的控制器操作中:

response.headers['Set-Cookie'] = 'Secure;SameSite=None'.

  • 请**不要**将 `SameSite=None` 添加到您的所有 cookie 中。这明确地将您的 cookie 标记为用于跨站点传递,并且可能不是您想要的。您将失去新默认设置提供的 CSRF 保护的安全优势。考虑将 `SameSite=Lax` 添加为默认值,并且**仅**在您 **需要** 跨站点 cookie 时才使用 `SameSite=None`。更多信息请访问 https://web.dev/samesite-cookies-explained (6认同)

ani*_*l.n 5

Action Dispatch Cookie负责将 Cookie 写入应用程序中设置的浏览器,这使用Rack::Utils.set_cookie_header!.

在rack版本1.6之后已经添加了支持SameSite,你需要在Gemfile中检查你的rack版本,如果是<1.6则需要添加以下代码config/initializers

require 'rack/utils'
module Rack
  module Utils
    def self.set_cookie_header!(header, key, value)
      case value
      when Hash
        domain  = "; domain="  + value[:domain] if value[:domain]
        path    = "; path="    + value[:path]   if value[:path]
        max_age = "; max-age=" + value[:max_age] if value[:max_age]
        expires = "; expires=" +
          rfc2822(value[:expires].clone.gmtime) if value[:expires]
        secure = "; secure"  if value[:secure]
        httponly = "; HttpOnly" if value[:httponly]
        same_site =
          case value[:same_site]
          when false, nil
            nil
          when :none, 'None', :None
            '; SameSite=None'
          when :lax, 'Lax', :Lax
            '; SameSite=Lax'
          when true, :strict, 'Strict', :Strict
            '; SameSite=Strict'
          else
            raise ArgumentError, "Invalid SameSite value: #{value[:same_site].inspect}"
          end
        value = value[:value]
      end
      value = [value] unless Array === value
      cookie = escape(key) + "=" +
        value.map { |v| escape v }.join("&") +
        "#{domain}#{path}#{max_age}#{expires}#{secure}#{httponly}#{same_site}"

      case header["Set-Cookie"]
      when nil, ''
        header["Set-Cookie"] = cookie
      when String
        header["Set-Cookie"] = [header["Set-Cookie"], cookie].join("\n")
      when Array
        header["Set-Cookie"] = (header["Set-Cookie"] + [cookie]).join("\n")
      end

      nil
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

完成后,您可以SameSite在创建新 cookie 时设置属性,例如:

cookies['testing'] = {
  value: 'test',
  path: '/',
  expiry: 1.weeks.from_now,
  same_site: :none
}
Run Code Online (Sandbox Code Playgroud)

您也可以将其添加same_site: <value>到您的会话存储中。

希望这可以帮助!