【架构师从入门到进阶】第五章DNSCDN网关优化思路——第七节网关-XSS攻击与预防网关协议转换路由转发负载均衡安全保障xss攻击类型反射型持久型反攻击消毒http only在前面的文章中我们讲了负载均衡讲了请求从客户端出发到服务器的中间过程。我们是按照用户请求到达我们服务器的顺序来讲解我们架构方面的知识的。那么在用户的请求到达我们服务器之前在一般的这些大型互联网系统中还有一个重要的组件叫做网关。我们前面讲了比如说用户操作了客户端中间经历了DNSCDN反向代理然后最终到达我们的server端。但是在到达我们具体提供的Web服务之前还有一个叫做网关的东西有可能在反向代理的后面有可能没有反向代理这一层过了网关之后接着就是nginx或者nginx在网关前面这些方案都有。好了那我们本篇文章来看一下网关。网关网关其实也可以做负载均衡比如说在微服务当中的Gateway就这类型的网关也是可以有负载均衡功能的还有一些企业自己自研的网关其实也有负载均衡功能。那么网关做负载均衡可以是项目所有接口的出入口就像一个关口一样就像一个房间的门所有的请求都得从这个门进从这个门出。一般在比较正规大型的公司中我们的请求在进入具体服务之前都有网关。网关有几大功能协议转换路由转发负载均衡安全保障协议转换协议转换是什么意思呢我来举一个例子。比如说公司内部的系统用的是dubbo协议开发的但是对外呢是一个标准的restful风格这个时候就需要用到协议转发。比如说这是一个网关然后下面是我们的服务网关和这些服务之间有可能用的dubbo或者说这些服务对外提供的协议就是dubbo协议但是外面的用户或者说客户端它来请求网关的时候用的是restful。比如说有的公司是用c、c开发的或者其他语言开发的然后他们这些语言去调用restful风格的http协议会比较方便一些但是他们去调用dubbo就不方便了。所以网关就需要将这种restful风格的http协议转换成我们自己用的dubbo协议。路由转发路由转发我也举个例子。比如说用户访问的是URL a但是经过网关之后将请求转发到内部的URL b。这样一是对内部地址的一种保护另外一方面也是涉及到解偶。这样的话对外永远都是URL a但是内部可以调整。一般的微服务也有对应的解决方案。这是一个网关然后内部有几个服务比如这个服务提供的是URL b但是对外你要访问这个URL a一方面是不让外面的调用方知道我们具体内部的这种编排URL地址的逻辑另外一方面就是说对外永远访问的是URL a。有可能我们的这个服务要删掉了或者说这个地址有调整可能需要把它改成URL c那么我们只在网关中把代码更新一下把a原来是到b的映射我们现在把它改成到c的映射就可以了而客户端的调用可以保持不变他们该怎么调还怎么调不用说因为我改成c了客户端的调用也要改成c然后客户端还得发布一个新版本这个是不需要的。负载均衡我们前面讲负载均衡呢已经讲了很多了它就是将请求分发到不同的服务器上。也就是说这是一个网关然后用户经过之后网关后面有多个服务它可以把请求分发到后面的多个服务这个是一个负载均衡的功能。安全保障还有一个就是安全性的保证。就是网关还要得保证系统的整体安全因为它是一个系统的出入口就像我们进一个写字楼门口有两个保安一样进地铁口还得过安检这是系统对外的唯一的一个出入口所以在这块保证安全是基本上是必做的。安全性的话我们这篇文章就讲一个xss攻击。然后后面再讲SQL注入csrf等等。xss攻击从一开始有互联网安全的威胁就一直在各种外部攻击和信息泄露的新闻到处可见。xss和sql注入是最主要的两种攻击手段全球大概有70%的攻击都来自xss攻击和sql注入。我们来看一下什么叫xss。xss就是Cross Site Script也就是跨站点脚本攻击。就是黑客通过篡改网页注入恶意的脚本当用户浏览网页时它通过控制用户的浏览器进行一些恶意的操作。比如说我是一个黑客我把一些脚本输入到系统里可能输入到某个系统中的一篇文章当中然后用户打开这篇文章那个脚本在浏览器里就自动去执行了然后我就写一些业务逻辑代码。类型反射型常见的xss的攻击一般有两种一种是反射型这种就是攻击者诱使用户点击一个恶意脚本的链接达到攻击的目的。这什么意思呢比如说用户最开始他登录了一个系统登录完系统之后他在那操作然后攻击者就把一个包含恶意脚本的信息推给他然后他一点这个恶意脚本他就做了攻击者想要他做的一些事情。比如说这是一个正常的服务器一个用户一个攻击者。然后用户去登录系统正常的输入用户名密码登录了然后他就开始正常浏览网页浏览网页的时候攻击者在他这个网页当中嵌入一段脚本比如说他浏览的是攻击者发布的一篇文章然后他就打开攻击者那篇文章但是攻击者那篇文章中有攻击者写的一些script的脚本然后脚本就在他的浏览器获取他的token信息获取他的一些用户敏感数据然后利用他的账户向服务器提交一些东西这个就叫做反射型的攻击。这种攻击有时候搞一些恶作剧还可以就怕这种攻击它会利用用户的cookie里面的用户名、账号、密码等信息甚至伪造一些交易盗用用户的财产。持久型还有一种叫做持久型的。这个是通过黑客提交恶意脚本的请求保存在被攻击的web站点的数据库中用户浏览网页时恶意脚本被包含在正常网页中用户浏览器一操作就达到了攻击的目的。这种攻击和上面的攻击区别就是反射型它只攻击局部持久型的是攻击是网站中只要浏览那个信息的人就可以。比如说有一个网站这正常的服务器攻击者把脚本直接放到服务器导致所有的用户在请求浏览正常网页的时候都会受到攻击。而反反射型的基本上有一个用户也在用攻击者也在用攻击者直接通过某种方式把脚本放在用户的浏览器执行。就是持久型的攻击就是放到数据库里反射型就是放到用户的页面。持久型的危害会比较大一些。反攻击xss一种非常古老的攻击手段但是它不断变化许多以前认为不可能被攻击的漏洞也逐渐被攻击了因此xss反攻击是非常复杂的。我们来聊一聊如何去应对xss的攻击。消毒第一种就是消毒。什么叫消毒呢就是xss攻击者一般是通过在请求中嵌入恶意脚本达到攻击的目的。如果我们能对用户的输入内容进行过滤也就是当我们检测到用户的输入内容中有危险的字符的时候比如说尖括号那就对用户进行提示比如说“您有非法输入”或者干脆将用户的危险字符进行替换在参数校验的时候直接把它replace成lt;。这样的话就可以防止大部分的攻击但这个时候要注意有时候会有一个误杀的情况比如说我输入了一串字符叫做“12”然后他把这个也替换成了这个“1lt2”然后展示的时候也展示成“1lt2”这样的话对用户来说是不友好的。所以说当遇到这种情况的时候要进行一个判断看看什么是正确的比如说判断一下前后的字符串。http only还有一个http only。http only最早是由微软提出的原理就是浏览器禁止页面中的JavaScript访问带有http only的cookie。http only并不是直接预防xss攻击的而是预防xss攻击之后窃取用户的cookie的。有一些人将一些敏感的信息写到cookie里然后一些攻击者就可以通过读取cookie来达到窃取他人信息的目的进而做一些危险的有损于用户的操作。那么我们可以在服务器向客户端写cookie的时候给cookie添加一个http only属性呢就能避免被攻击者窃取。一般的怎么去设置这个cookie呢CookiecookienewCookie(cookieName,cookieValue);cookie.setHttpOnly(true);response.addCookie(cookie);这么这么写上就OK了。然后攻击者就不能去操作这个cookie了。