Waf 防火墙对 Request Method OPTIONS请求误拦截记录
前因
生产存在A域名去调用B域名接口,通过devtools查看接口时发现前端报跨域请求的错误,又因为请求是CORS跨域了,浏览器为了确定服务端能够接受本次请求,会事先发起一个OPTIONS请求,以确定服务器能够接受哪些请求方式,以及是否支持跨域。也因为此,导致waf认为OPTIONS
为HTTP方法限制
攻击。
OPTIONS
请求通常都是不可避免的,是浏览器的一种自发行为。
解决
对waf防火墙OPTION方法限制规则
进行域名的放白。
option: 预检请求理解
options
请求属于浏览器的预检请求,查看服务器是否接受请求,预检通过后,浏览器才会去发get,post,put,delete
等请求。至于什么情况下浏览器会发预检请求,浏览器会会将请求分为两类,简单请求与非简单请求,非简单请求会产生预检options请求。
出于安全考虑,并不是所有域名访问后端服务都可以。其实在正式跨域之前,浏览器会根据需要发起一次预检(也就是option请求),用来让服务端返回允许的方法(如get、post),被跨域访问的Origin(来源或者域),还有是否需要Credentials(认证信息)等。那么浏览器在什么情况下能预检呢?
浏览器将CORS请求分为两类:简单请求(simple request)和非简单请求(not-simple-request)
简单请求浏览器不会预检,而非简单请求会预检。
这两种方式怎么区分?
同时满足下列三大条件,就属于简单请求,否则属于非简单请求
1.请求方式只能是:GET、POST、HEAD
2.HTTP请求头限制这几种字段:Accept、Accept-Language、Content-Language、Content-Type、Last-Event-ID
3.Content-type只能取:application/x-www-form-urlencoded、multipart/form-data、text/plain
对于简单请求,浏览器直接请求,会在请求头信息中,增加一个origin字段,来说明本次请求来自哪个源(协议+域名+端口)。
服务器根据这个值,来决定是否同意该请求,服务器返回的响应会多几个头信息字段。
1.Access-Control-Allow-Origin
:该字段是必须的,* 表示接受任意域名的请求,还可以指定域名
2.Access-Control-Allow-Credentials
:该字段可选,是个布尔值,表示是否可以携带cookie,(注意:如果Access-Control-Allow-Origin字段设置*,此字段设为true无效)
3.Access-Control-Allow-Headers
:该字段可选,里面可以获取Cache-Control、Content-Type、Expires等,如果想要拿到其他字段,就可以在这个字段中指定。