nginx处理options请求()

运维=nginx处理options请求

发表于 2019-09-29  |  分类于 前端  |  没有评论

禁止OPTIONS请求响应200

运维:补漏洞禁止OPTIONS请求响应200。

安全扫描检测到部分请求地址,将对应方法由GET、POST、HEAD改成OPTIONS,发现可以返回服务器的允许请求设置信息,如

Allow → GET,HEAD,POST,OPTIONS,TRACE

Cache-Control → max-age=86400Connection → keep-alive

Content-Encoding → gzip

Content-Length → 20Content-Type → text/html

Date → Thu, 30 Jun 2016 04:00:24 GMT

Expires → Fri, 01 Jul 2016 04:00:24 GMT

Server → bfe/1.0.8.14

Vary → Accept-Encoding,User-Agent

一版设置允许跨域接口的返回信息中包含如上,后端没有通过CORS设置允许跨域,不会返回带Allow对应信息。 安全漏洞检测结果要求需要将禁止在OPTIONS请求响应200,因为在返回结果中会携带allow信息,可以直接在nginx中修改, 在location内部加入如下:对OPTIONS请求进行禁止:

if ($request_method = ‘OPTIONS’) {

return 403;

}

但是当后端设置允许请求跨域时,对于有些跨域请求,在请求前先发一个OPTIONS请求,根据返回结果判断请求所在域是否允许请求,对于设置了允许跨域的后台,都会返回allow的信息,如果没有则需要在nginx中如下修改,设置OPTIONS请求返回header信息,保证真正的跨域请求可以发送。

if ($request_method = ‘OPTIONS’) {

add_header Access-Control-Allow-Origin *;

add_header Access-Control-Allow-Credentials true;

add_header Access-Control-Allow-Methods ‘GET, POST, OPTIONS’;

add_header ‘Access-Control-Allow-Headers’ ‘DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type’;

return 200;

}

对应安全漏洞中要求,OPTIONS不能返回200,所以返回204。(请求成功,但是没有内容)

if ($request_method = ‘OPTIONS’) {    

add_header Access-Control-Allow-Origin *;

add_header Access-Control-Allow-Credentials true;

add_header Access-Control-Allow-Methods ‘GET, POST, OPTIONS’;

add_header ‘Access-Control-Allow-Headers’ ‘DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type’;

return 204;

}

如上所说,并不是所有的跨域请求都需要先发OPTIONS请求的,规范里面规定,以下情况不需要先发一个OPTIONS请求:

  • 1、请求类型必须是GET、HEAD、POST中的一种。
  • 2、请求的Header里面只能包涵一些规范重点Header,以及规范的值,包括:Accept、Accept-Language、Content-Language、Content-Type、DPR、Downlink、Save、Data、Viewport-Width、Width
  • 3、Content-Type的类型必须是以下几种:application/x-www-form-urlencoded、multipart/form-data、text/plain 所以,如果你不希望浏览器多余的发一个OPTIONS请求,只要遵循这个规范就可以了。 但是有时候因为需求原因,也难避免要自定义一些Header。比如,很多JS的AJAX库,都会自定义一个Header,让服务器可以识别出这是否是一个异步请求,这样OPTIONS请求就一定要被先发送了。

对于必须要禁止OPTIONS请求响应的,意味着不可以正常使用后端CORS跨域设置了,可以通过nginx代理方式实现跨域功能,及在nginx配置中加入对应请求配置,该请求域下的请求将被代理。

location  /push {

       proxy_pass   http://127.0.0.1:15080;

       #access_log /logs/nginx/access.log main;

}

————————

运维=nginx处理options请求

发表于 2019-09-29  |  分类于 前端  |  没有评论

禁止OPTIONS请求响应200

运维:补漏洞禁止OPTIONS请求响应200。

安全扫描检测到部分请求地址,将对应方法由GET、POST、HEAD改成OPTIONS,发现可以返回服务器的允许请求设置信息,如

Allow → GET,HEAD,POST,OPTIONS,TRACE

Cache-Control → max-age=86400Connection → keep-alive

Content-Encoding → gzip

Content-Length → 20Content-Type → text/html

Date → Thu, 30 Jun 2016 04:00:24 GMT

Expires → Fri, 01 Jul 2016 04:00:24 GMT

Server → bfe/1.0.8.14

Vary → Accept-Encoding,User-Agent

一版设置允许跨域接口的返回信息中包含如上,后端没有通过CORS设置允许跨域,不会返回带Allow对应信息。 安全漏洞检测结果要求需要将禁止在OPTIONS请求响应200,因为在返回结果中会携带allow信息,可以直接在nginx中修改, 在location内部加入如下:对OPTIONS请求进行禁止:

if ($request_method = ‘OPTIONS’) {

return 403;

}

但是当后端设置允许请求跨域时,对于有些跨域请求,在请求前先发一个OPTIONS请求,根据返回结果判断请求所在域是否允许请求,对于设置了允许跨域的后台,都会返回allow的信息,如果没有则需要在nginx中如下修改,设置OPTIONS请求返回header信息,保证真正的跨域请求可以发送。

if ($request_method = ‘OPTIONS’) {

add_header Access-Control-Allow-Origin *;

add_header Access-Control-Allow-Credentials true;

add_header Access-Control-Allow-Methods ‘GET, POST, OPTIONS’;

add_header ‘Access-Control-Allow-Headers’ ‘DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type’;

return 200;

}

对应安全漏洞中要求,OPTIONS不能返回200,所以返回204。(请求成功,但是没有内容)

if ($request_method = ‘OPTIONS’) {    

add_header Access-Control-Allow-Origin *;

add_header Access-Control-Allow-Credentials true;

add_header Access-Control-Allow-Methods ‘GET, POST, OPTIONS’;

add_header ‘Access-Control-Allow-Headers’ ‘DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type’;

return 204;

}

如上所说,并不是所有的跨域请求都需要先发OPTIONS请求的,规范里面规定,以下情况不需要先发一个OPTIONS请求:

  • 1、请求类型必须是GET、HEAD、POST中的一种。
  • 2、请求的Header里面只能包涵一些规范重点Header,以及规范的值,包括:Accept、Accept-Language、Content-Language、Content-Type、DPR、Downlink、Save、Data、Viewport-Width、Width
  • 3、Content-Type的类型必须是以下几种:application/x-www-form-urlencoded、multipart/form-data、text/plain 所以,如果你不希望浏览器多余的发一个OPTIONS请求,只要遵循这个规范就可以了。 但是有时候因为需求原因,也难避免要自定义一些Header。比如,很多JS的AJAX库,都会自定义一个Header,让服务器可以识别出这是否是一个异步请求,这样OPTIONS请求就一定要被先发送了。

对于必须要禁止OPTIONS请求响应的,意味着不可以正常使用后端CORS跨域设置了,可以通过nginx代理方式实现跨域功能,及在nginx配置中加入对应请求配置,该请求域下的请求将被代理。

location  /push {

       proxy_pass   http://127.0.0.1:15080;

       #access_log /logs/nginx/access.log main;

}