读书笔记:大型分布式网站架构设计与实践(3)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xiaoyi52/article/details/83028431

3 互联网安全架构

随着移动物联网的兴起,以及Restful和Web Service等技术的大规模使用,HTTP协议因其使用方便以跨平台的特性,在Web开发和SOA领域得到了广泛应用,但其所涵盖的信息,大都是未经加密的明文,信息获取门槛的降低,也为应用架构的安全性与稳定性带来了挑战。

本章分别介绍了常见的Web攻击手段,常用的安全算法,Https协议。

3.1 常见的Web攻击

常见的Web攻击有XSS攻击、CSRF攻击、SQL注入攻击、DDos攻击等。

3.1.1 XSS

XSS全称跨站脚本攻击(Cross Site Scripting),为了不跟层叠样式表CSS混淆,将其缩写为XSS。跨站脚本攻击指将恶意脚本嵌入在网页中,当用户打开网页时,脚本程序便开始在客户端的浏览器上执行,以盗取客户端cookie、用户名密码,下载执行病毒木马程序甚至是获取客户端admin权限等。

XSS按照形式分,有持久性(存储型)和非持久性(反射型);按照攻击介质分有JSXSS和FlashXSS,按照接口分有DOM XSS和非DOM XSS。

反射型XSS指浏览器每次都要在参数中提交恶意数据才能触发的跨站脚本漏洞。事实上反射型XSS漏洞大多数攻击数据是包含在URL中的,需要用户的浏览器访问到这个URL,恶意代码才执行。

存储型XSS通过提交恶意数据到存储器(如数据库),Web应用程序输出的时候是从存储器中读出恶意数据输出到页面的一类跨站脚本漏洞。举个例子,某论坛没有对传入的HTML作处理,那么用户就可以发一个帖子,内容包含“<script>[code]</script>”,这样论坛的应用服务器就会将这个帖子存储起来,并在页面展示帖子内容。而其他用户访问这个帖子时这段内容就被浏览器当做脚本来执行。

XSS攻击防御

原则:不相信客户输入的数据。

可以使用XSS Filter,对用户输入的内容进行过滤。如对用户提交的数据进行有效性验证,仅接受指定长度范围内并符合期望格式的内容提交;过滤一些常见的敏感字符,如<> ‘ ‘’ “onclick” “onfocus”等;过滤特殊的Html标签,如:<script>,&lt; for, &quot for等等。

但实际上,充分而完全的过滤是无法实现的,因为攻击方有各种各样的方式来绕过服务器端的过滤,最典型的就是对URL和参数进行各种编码,经过编码后的内容就无法进行过滤。因此更完善的思路是:对输入进行过滤,对输出进行编码。也就是说,对提交的所有内容进行过滤,对url参数进行过滤,过滤掉会导致脚本执行的相关内容;然后对动态输出到页面的内容进行html编码,使脚本无法在浏览器执行。

3.1.2 CSRF

CSRF全称是跨站请求伪造(cross site request forgery),是一种对网站的恶意利用。与XSS攻击利用站内的信任用户不同,CSRF则是通过伪装成来自受信任用户的请求来利用受信任的网站,可以这样理解:攻击者盗用受信任用户的身份,以其身份向第三方网站发送恶意请求。CSRF攻击原理如下图所示:
在这里插入图片描述

CSRF防御
(1)将cookie设置为HttpOnly
CSRF攻击很大程度上是利用了浏览器的cookie,为了防止站内的XSS漏洞盗取cookie,需要在cookie设置HttpOnly属性,这样通过程序就无法读取到cookie信息,避免了攻击者伪造cookie的情况出现。Java可通过如下代码设置:
response.setHeader(“Set-Cookie”, “cookiename=cookievalue;HttpOnly”)。

(2)增加token
CSRF攻击利用的是cookie中用户的验证信息,如果在请求中放入攻击者所不能伪造的信息,并且该信息不存在与cookie中,比如以参数的形式加入一个随机产生的token,并在服务端进行token校验,就可以防御CSRF攻击了。

(3)通过Referer识别
在Http中有一个字段Referer,记录了该HTTP请求的请求来源。CSRF攻击伪造的请求必然与真正的用户请求来源不同。因此通过验证Referer也可以防御CSRF攻击。

3.1.3 SQL注入

SQL注入是指通过把SQL命令伪装成正常的HTTP请求参数,传递到服务器,欺骗服务器执行恶意的SQL命令以达到攻击目的。

举个简单的栗子,假设服务器端验证用户登录时,将用户输入的用户名和密码作为登录凭证,显然要查询数据库以获取用户信息。如果服务器端用select * from table where user_name = username and pass_word = password来查询,而用户输入的密码为 ‘ or ‘1’=’1,sql语句就变成了select * from table where user_name = username and pass_word = ‘’ or ‘1’=’1’,不管用户名和密码是什么内容,or后面的条件都能满足,任意输入一个用户名就能绕过密码验证。

SQL是一种解释型语言,运行时由一个运行时组件解释语言代码并执行其中包含的指令,其数据是由代码和用户提交的数据共同组成。基于这种执行方式,就会产生代码注入的漏洞。

SQL注入防范

(1)使用预编译语句
作为一种更为安全的动态字符串的构建方法,预编译语句使用参数占位符来替换需要动态传入的参数,并在创建PreparedStatement对象时就指定了SQL语句且立即发送给DBMS进行编译。在执行的时候动态参数如果含有特殊字符,会被进行转义。 因此动态传入的参数始终是参数,无法被伪装成SQL指令。

(2)使用ORM框架
ORM框架也会对关键字或特殊字符进行转义。如Mybatis框架在动态参数前面使用符号#,以对动态参数中的关键字或特殊符号进行转义,防止SQL注入。

(3)对密码进行处理后存放
对存储的密码进行单向Hash,如使用MD5进行摘要。这样做的好处是万一用户信息泄露,也不会直接暴露密码。随着近几年技术的发展,流行一些MD5摘要的破解方法,如彩虹表。因此更安全的做法是哈希加盐法,也就是将密码和盐拼接在一起之后再进行摘要,目的是生成Hash时给予一个扰动,使Hash值与标准的Hash结果不同。

(4) 处理好异常
后台异常信息经常会提示一些数据库相关信息,必须对系统异常信息进行处理,防止敏感信息暴露。

3.1.4 文件上传攻击

文件上传攻击指恶意攻击者利用一些站点没有对上传文件的类型做很好的校验,上传了可执行的文件或脚本,通过脚本获得服务器上相应的权利或者诱导外部用户访问,下载上传的木马文件,达到攻击目的。

文件上传攻击防范
防范文件上传攻击,主要方式有:对上传的文件后缀和文件类型进行白名单校验、限制上传文件的大小、对上传的文件进行重命名等。

(1)文件上传的目录设置为不可执行

(2)判断文件类型
可以结合使用MIME Type,后缀检查,文件类型魔数进行校验,且需要使用白名单方式,即设置允许的类型。另外对于图片的处理,可以使用压缩函数或者resize函数,在处理图片的同时破坏图片中可能包含的HTML代码。

(3)使用随机数改写文件名和文件路径
文件上传如要要执行代码,需要用户能够访问到这个文件。如果不知道上传文件的存放路径和文件名称,即使上传了也无法访问。

3.1.5 DDoS攻击

DDoS(Distributed Denial of Service),分布式拒绝服务攻击,是目前最难以防御的攻击方式之一。DDoS是在DoS的基础上产生的,最基本的DoS攻击利用合理的客户端请求来占用大量的服务器资源,从而达到瘫痪服务器的目的。随着硬件水平和网络技术的发展,传统的DoS攻击已经没有什么效果了。DDoS攻击原理与DoS一样,只不过是发起攻击的机器更多。通常攻击者会控制大量普通用户的计算机,称之为“肉鸡”,并通过指令使大量肉鸡同时对某个主机进行访问,达到瘫痪目标主机的目的。

DDoS攻击有几种类型,如依靠蛮力的ICMP Flood、UDP Flood等,也有依靠协议和软件漏洞的Slowloris攻击、Hash碰撞攻击等,但用的最多的是两者结合的方式,既利用了协议缺陷,又有了海量的流量,如SYN Flood,DNS Query Flood等。

SYN Flood

SYN Flood是互联网最经典的攻击方式之一,利用了TCP协议建立通信连接的原理。TCP建立通信连接需要三次握手过程:
在这里插入图片描述

第一步,客户端发送一个包含SYN标识的TCP报文,该报文中包含客户端的端口号和TCP连接的初始序列号。

第二步,服务器在收到客户端的SYN报文后,会返回一个SYN+ACK的报文。表示客户端请求被接收,同时TCP序列号加1。

第三步,客户端在接收到服务端的SYN+ACK报文后,也会返回一个ACK报文给服务端,TCP序列号加1。

经过以上三步后,TCP连接便建立好,双方可以进行通信。而这三个步骤就叫做三次握手。
在这三次握手过程中,有一些异常处理机制。如在第三步,如果服务端没有收到客户端的ACK报文,服务端一般会进行重试,再次发送SYN+ACK报文给客户端,并且一直处于SYB_RECV状态,将客户端加入等待列表。重试会有3~5次,每次间隔30s左右。在重试发送报文之后,服务器会预留一部分资源给即将建立的TCP连接;同时由于服务器资源有限,当服务器维护的等待列表超限之后,服务器就不再接受新的TCP连接了。

SYN Flood正是利用这个原理,伪造大量的IP地址给服务器发送SYN报文,而由于伪造的IP地址不可能给予回应,因此服务器端将维护一个非常大的半连接等待列表,并不断重试,占用大量资源。更甚者将服务器端的等待列表占满,导致正常的TCP连接无法建立。

3.2 常用的安全算法

常用的安全算法主要有摘要算法、对称加密算法和非对称加密算法、信息编码等。具体见另一篇blog:常用的通讯安全处理机制

3.3 HTTPS协议

Https协议比Http更安全,是HTTP的安全版。具体介绍见博主的另外一篇文章:HTTPS协议

猜你喜欢

转载自blog.csdn.net/xiaoyi52/article/details/83028431