如果我在application.rb
中输出config.action_dispatch.default_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"}
但是,如果我向我的应用程序提出请求(使用卷曲/浏览器/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
<
这一切都是本地运行的,没有网络服务器/代理。在生产中,我缺少相同的标头。
Rails API模式是否删除了它认为与API无关的标头?还是我的应用程序中只能是其他代码?
API模式下的Rails 5.x不包括ActionDisPatch默认标头。
这是一个问题:https://github.com/rails/rails/issues/34940。
,但现在已修复,将在版本6.0.0中使用:https://github.com/rails/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
,意味着您需要将自己的逻辑添加到上面的所有标题(例如内容安全策略(的配置中,请确保在应用程序控制器上设置该代码(此站点可能有助于安全配置(。