运维=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;
}
标签:Control,请求,header,options,nginx,Allow,OPTIONS,跨域 From: https://www.cnblogs.com/Lqdream/p/16922869.html