互联网安全架构
介绍一些常见的 Web攻击手段,如XSS攻击、CSRF攻击、SQL注入攻击、DDos攻击等。XSS攻击、CSRF攻击、SQL注入攻击等这类攻击手段相对来说比较容易防范,对症下药即可。对于企业来说,更多是需要从开发流程上来予以保障,以免因人为的疏忽而造成损失。而对于DDos攻击来说,攻击手段多样,产生的影响及危害巨大,对它的防范也是一个复杂的系统工程,需要持续性地组织防御演练,做好应急预案,并保持有效的监控。
XXS攻击
XSS攻击的全称是跨站脚本攻击(Cross Site Scripting),为不跟层叠样式表(Cascading Style Sheets,CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS',它是Web应用程序中最常见到的攻击手段之一。跨站脚本攻击指的是攻击者在网页中嵌入恶意脚本程序,当用户打开该网页时,脚本程序便开始在客户端的浏览器上执行,以盗取客户端cookie、用户名密码,下载执行病毒木马程序,甚至是获取客户端 admin 权限等。
XXS之所以会发生,是因为用户输入的数据变成了代码,因此,我们需要对用户输入的数据进行HTML转义处理,将其中的“尖括号”、“单引号”、“引号”之类的特殊字符进行转义编码。
CSRF攻击
CSRF攻击的全称是跨站请求伪造(cross site request forgery),是一种对网站的恶意利用,尽管听起来跟XSS跨站脚本攻击有点相似,但事实上CSRF与XSS差别很大,XSS利用的是站点内的信任用户,而CSRF则是通过伪装来自受信任用户的请求来利用受信任的网站。你可14以这么押解CSRF攻击:攻击者盗用了你的身份,以你的名义向第三方网站发送恶意请求。CRSF能做的?情包括利用你的身份发邮件、发短信、进行交易转账等,甚至盗取你的账号。
CSRF的防御措施:
(1)将cookie设置为HttpOnly
CRSF攻击很大程度上是利用了浏览器的cookie,为了防止站内的XSS漏洞盗取 cookie,需要在cookie中设置“HttpOnly”属性,这样通过程序(如JavaScript脚本、Applet等)就无法读取到cookie信息,避免了攻击者伪造cookie的情况出现。
(2)增加token
CSRF 攻击之所以能够成功,是因为攻击者可以伪造用户的请求,该请求中所有的用户验证信息都存在于 cookie中,因此攻击者可以在不知道用户验证信息的情况下直接利用用户的cookie 来通过安全验证。由此可知,抵御 CSRF攻击的关键在于:在请求中放入攻击者所不能伪造的信息,并且该信息不存在于cookie之中。鉴于此,系统开发人员可以在HTTP请求中以参数的形式加入一个随机产生的 token,并在服务端进行 token 校验,如果请求中没有 token 或者token内容不正确,则认为是CSRF攻击而拒绝该请求。
(3)通过Referer
根据 HTTP协议,在HTTP头中有一个字段叫Referer,它记录了该HTTP请求的来源地址。在通常情况下,访问一个安全受限的页面的请求都来自于同一个网站。比如某银行的转账是通过用户访问 http://www.xxx.com/transfer.do页面完成的,用户必须先登录www.xxx.com,然后通过单击页面上的提交按钮来触发转账事件。当用户提交请求时,该转账请求的 Referer 值就会是提交按钮所在页面的URL(本例为 www.xxx.com/transfer.do)。如果攻击者要对银行网站实施CSRF攻击,他只能在其他网站构造请求,当用户通过其他网站发送请求到银行时,该请求的Referer的值是其他网站的地址,而不是银行转账页面的地址。因此,要防御CSRF攻击,银行网站只需要对于每一个转账请求验证其 Referer值即可,如果是www.xxx.com域名开头的地址,则说明该请求是来自银行网站自己的请求,是合法的;如果Referer是其他网站,就有可能是CSRF攻击,则拒绝该请求。
SQL注入攻击
所谓SQL注入,就是通过把SQL命令伪装成正常的HTTP请求参数,传递到服务端,欺骗服务器最终执行恶意的SQL命令,达到入侵目的。攻击者可以利用SQL注入漏洞,查询非授权信息,修改数据库服务器的数据,改变表结构,甚至是获取服务器root权限。总而言之,SQL注入漏洞的危害极大,攻击者采用的SQL指令决定了攻击的威力。目前涉及的大批量数据泄露的攻击事件,大部分都是通过SQL注入来实施的。
SQL注入的防范:
(1)使用预编译语句。
预编译语句 PreparedStatement 是java.sql中的一个接口,继承自 Statement接口。通过Statement对象执行SQL语句时,需要将SQL语句发送给DBMS,由DBMS先进行编译后再执行。而预编译语句和 Statement不同,在创建 PreparedStatement对象时就指定了SQL语句,该语句立即发送给DBMS 进行编译,当该编译语句需要被执行时,DBMS直接运行编译后的SQL语句,而不需要像其他SQL语句那样先将其编译。
(2)使用ORM框架
由上文可见,防止SQL注入的关键在于对一些关键字符进行转义,而常见的一些ORM框架,如IBATIS,Hibernate等,都支持对应相关的关键字或者特殊符号进行转义,可以通过简单的配置,很好的防御SQL注入漏洞,降低了普通的开发人员进行安全编程的门槛。
(3)避免免密码明文存放
对存储的密码进行单向Hash,如使用MD5对密码进行摘要,而非直接存储明文密码,这样的好处就是万一用户信息泄露,即圈内所说的被“拖库””,黑客无法直接获取用户密码,而只能得到一串跟密码相差十万八千里的Hash码。
这种方法以前很管用,但是近几年随着技术的发展,开始流行一种使用彩虹表”的破解方法,能够根据用户密码的Hash码,比较快速的逆向得出密码的原文(或者是碰撞串),这样,使得原本安全的密码摘要的方式,也变得不那么安全。
随后便有人提出了哈希加盐法(Hash+Salt),能够在一定程度上解决这个问题,所谓加盐(Salt)其实很简单,就是在生成Hash时给予一个扰动,使Hash值与标准的 Hash 结果不同,这样就可以对抗彩虹表了。
(4)处理好相应的异常
后台的系统异常,很可能包含了一些如服务器版本、数据库版本、编程语言等信息,甚至是数据库连接的地址与用户名密码,攻击者可以按图索骥,找到对应版本的服务器漏洞或者数据库漏洞进行攻击,因此,必须要处理好后台的系统异常,重定向到相应的错误处理页面,而不是任由其直接输出到页面上。
DOS攻击
DDoS (Distributed Denial of Service)即分布式拒绝服务攻击,是目前最为强大、最难以防御的攻击方式之一。要理解DDos,得先从DoS说起。最基本的DoS攻击就是利用合理的客户端请求来占用过多的服务器资源,从而使合法用户无法得到服务器的响应。DDoS 攻击手段是在传统的DoS攻击基础之上产生的一类攻击方式,传统的DoS攻击一般是采用一对一的方式,当攻击目标的CPU速度、内存或者网络带宽等各项性能指标不高的情况下,它的效果是明显的。
但随着计算机与网络技术的发展,计算机的处理能力显著增加,内存不断增大,同时也出现了千兆级别的网络,这使得DoS攻击逐渐失去了效果。这时分布式拒绝服务攻击手段(DDoS)便应运而生了。理解了DoS攻击后,DDoS的原理就非常简单了,它指的是攻击者借助公共网络,将数量庞大的计算机设备联合起来作为攻击平台,对一个或多个目标发动攻击,从而达到。痪目标主机的目的。通常在攻击开始前,攻击者会提前控制大量的用户计算机,称之为“肉鸡”,并通过指令使大量的肉鸡在同一时刻对某个主机进行访问,从而达到瘫痪目标主机的目的。
DDoS的攻击有很多种类型,如依赖蛮力的ICMP Flood、UDP Flood等,随着硬件性能的提升,需要的机器规模越来越大,组织大规模的攻击越来越困难,现在已经不常见。还有就是依赖协议特征和具体的软件漏洞进行的攻击,如 Slowloris 攻击、Hash 碰撞攻击等,这类攻击主要利用协议和软件漏洞发起攻击,需要在特定环境下才会出现,更多的攻击者采用的是前面两种的混合方式,即利用了协议、系统的缺陷,又具备了海量的流量,如SYN Flood、DNS QueryFlood等。