概述
有时间在做验证码校验时,服务端会存放当前浏览器用户的临时验证码信息,比如通过session、cookie等方式进行存放,在校验的时候也方便使用和更新等。
问题描述
系统是通过cookie进行存放到浏览器端,cookie的值是经过加密,用户是看不到未加密的数据,当用户第一次进入页面,图形验证码会生成一个code,同时往浏览器写入cookie;用户可以多次点击重新生成验证码,相应的cookie值也要进行更新替换,否则校验的时候无法通过。
前端是通过ajax请求进行更新图形验证码,服务端同时也会创建一个新的对象,cookie的key都是一样的,只是值不同。
用户反馈验证一直不通过,经过开发排查,发现每次post请求后,浏览器里的cookie值没有更新,一直是第一次的内容,除非是每次都刷新页面,cookie值才会更新。
开始怀疑是不是云盾做了安全策略,导致cookie未更新,毕竟云盾会做缓存机制。先排除云盾问题,通过host配置回源IP,发现还是没有变化,浏览器一直是使用的google浏览器,response headers返回的cookie已经变化了,就是无法写入到浏览器。
截图如下:
因为最近一直是没有更新代码,本地和测试环境都正常,线上有异常,查看cookie创建代码,把path的值设置“/”,结果还是一样不能更新。
第二天突然脑袋想了一下,会不会是浏览器的问题,就换一个火狐测试看看,结果有2个cookie值,其中一个是会更新,另一个不会更新,如下图:
解决方案
两个cookie对比,发现除了值不一样,剩下的就是path不同,但是代码已经设置一样了,结果返回的时候还是一样被强制加上:Path:"/ X-Frame-Options: deny"
想了一下,什么时候加上这个参数,应该是前段时间扫描漏洞和安全的时候,要求加上限制导致的,就在web.config里找一下配置,发现如下代码:
<system.webServer>
<httpProtocol>
<customHeaders>
<add name="X-Frame-Options" value="deny" />
<remove name="Server" />
<remove name="X-AspNet-Version" />
<remove name="X-AspNetMvc-Version" />
<remove name="X-Powered-By" />
</customHeaders>
</httpProtocol>
</system.webServer>
在customHeaders里多加了一行配置:<add name="X-Frame-Options" value="deny" />
会强制把path附上值,导致不一致,因此在google浏览器等,不会覆盖之前的值,个别浏览器是可以看到会有2个cookie,容易排查问题。
删除<add name="X-Frame-Options" value="deny" />即可。