Rails 5.2 API 模式吞没默认安全性 headers 吗?
Does Rails 5.2 API mode swallow default security headers?
如果我在 application.rb
中输出 config.action_dispatch.default_headers
我会看到所有 standard rails headers:
{"X-Frame-Options"=>"SAMEORIGIN", "X-XSS-Protection"=>"1; mode=block", "X-Content-Type-Options"=>"nosniff", "X-Download-Options"=>"noopen", "X-Permitted-Cross-Domain-Policies"=>"none", "Referrer-Policy"=>"strict-origin-when-cross-origin"}
但是,如果我随后向我的应用程序发出请求(使用 curl/browser/postman),我将看不到上述任何内容。我只看到以下内容:
$ curl -v -XGET 'localhost:4000/myresource/581'
* TCP_NODELAY set
* Connected to localhost (::1) port 4000 (#0)
> GET /myresource/581 HTTP/1.1
> Host: localhost:4000
> User-Agent: curl/7.54.0
> Accept: */*
>
< HTTP/1.1 200 OK
< Content-Type: application/json; charset=utf-8
< ETag: W/"292a7d87b10e292374e765dd0b56fee7"
< Cache-Control: max-age=0, private, must-revalidate
< X-Request-Id: 7ff75ff6-f598-4489-9439-a4c17c6a5480
< X-Runtime: 0.025049
< Transfer-Encoding: chunked
<
这都是本地 运行,没有网络 server/proxy。在生产中我缺少相同的 headers.
Rails API 模式是否删除了它认为与 API 无关的 headers?或者可能只是我的应用程序中的一些其他代码在执行此操作?
Rails 5.x in API 模式不包括 ActionDispatch 默认 headers.
这是一个问题:https://github.com/rails/rails/issues/34940。
但现在已修复,将在 6.0.0 版本中提供:https://github.com/rails/rails/pull/32484
我 运行 几个月前遇到了同样的问题,正如@Matheus 提到的,他们在 rails 6
中修复了这个问题,但以防你遇到 rails 5.2
,这是我的案例,这是我解决问题的方法,希望对您有所帮助! :
before_action :put_headers
def put_headers
response.set_header('Referrer-Policy', 'strict-origin-when-cross-origin')
response.set_header('X-Content-Type-Options', 'nosniff')
response.set_header('X-Frame-Options', 'SAMEORIGIN')
response.set_header('X-XSS-Protection', '1; mode=block')
response.set_header('Content-Security-Policy', "default-src 'self' https:; " \
"img-src 'self' https:;" \
"media-src 'none'; " \
"object-src 'none'; " \
"script-src 'self'; " \
"style-src 'self' ")
end
注意上面只是一个example of configuration
意味着你需要在上面的配置中为所有headers(例如内容安全策略)添加自己的逻辑,也一定要在应用程序控制器上设置该代码 (this site may help with security configuration)。
如果我在 application.rb
中输出 config.action_dispatch.default_headers
我会看到所有 standard rails headers:
{"X-Frame-Options"=>"SAMEORIGIN", "X-XSS-Protection"=>"1; mode=block", "X-Content-Type-Options"=>"nosniff", "X-Download-Options"=>"noopen", "X-Permitted-Cross-Domain-Policies"=>"none", "Referrer-Policy"=>"strict-origin-when-cross-origin"}
但是,如果我随后向我的应用程序发出请求(使用 curl/browser/postman),我将看不到上述任何内容。我只看到以下内容:
$ curl -v -XGET 'localhost:4000/myresource/581'
* TCP_NODELAY set
* Connected to localhost (::1) port 4000 (#0)
> GET /myresource/581 HTTP/1.1
> Host: localhost:4000
> User-Agent: curl/7.54.0
> Accept: */*
>
< HTTP/1.1 200 OK
< Content-Type: application/json; charset=utf-8
< ETag: W/"292a7d87b10e292374e765dd0b56fee7"
< Cache-Control: max-age=0, private, must-revalidate
< X-Request-Id: 7ff75ff6-f598-4489-9439-a4c17c6a5480
< X-Runtime: 0.025049
< Transfer-Encoding: chunked
<
这都是本地 运行,没有网络 server/proxy。在生产中我缺少相同的 headers.
Rails API 模式是否删除了它认为与 API 无关的 headers?或者可能只是我的应用程序中的一些其他代码在执行此操作?
Rails 5.x in API 模式不包括 ActionDispatch 默认 headers.
这是一个问题:https://github.com/rails/rails/issues/34940。
但现在已修复,将在 6.0.0 版本中提供:https://github.com/rails/rails/pull/32484
我 运行 几个月前遇到了同样的问题,正如@Matheus 提到的,他们在 rails 6
中修复了这个问题,但以防你遇到 rails 5.2
,这是我的案例,这是我解决问题的方法,希望对您有所帮助! :
before_action :put_headers
def put_headers
response.set_header('Referrer-Policy', 'strict-origin-when-cross-origin')
response.set_header('X-Content-Type-Options', 'nosniff')
response.set_header('X-Frame-Options', 'SAMEORIGIN')
response.set_header('X-XSS-Protection', '1; mode=block')
response.set_header('Content-Security-Policy', "default-src 'self' https:; " \
"img-src 'self' https:;" \
"media-src 'none'; " \
"object-src 'none'; " \
"script-src 'self'; " \
"style-src 'self' ")
end
注意上面只是一个example of configuration
意味着你需要在上面的配置中为所有headers(例如内容安全策略)添加自己的逻辑,也一定要在应用程序控制器上设置该代码 (this site may help with security configuration)。