第 11 周 怎么又翻车了???
安全架构
XSS 攻击
XSS 攻击防御手段
消毒:XSS 攻击者一般都是通过在请求中嵌入恶意脚本达到攻击目的,这些脚本是一般 用户输入中不使用的,如果进行过滤和消毒处理,即对某些 HTML 危险字符转义。
SQL 注入攻击
获取数据库表结构信息的手段
开源:如果网站采用开源软件搭建,如用 Discuz! 搭建论坛网站,那么网站数据库结构 就是公开的,攻击者可以直接获得。
错误回显:如果网站开启错误回显,攻击者故意构造非法参数,服务端异常信息会输出 到浏览器端,为攻击猜测数据库表结构提供了便利。
盲注:网站关闭错误回显,攻击者根据页面变化情况判断 SQL 语句的执行情况,据此猜 测数据库表结构,此种方式攻击难度较大。
注入攻击防御手段
消毒:和防 XSS 攻击一样,请求参数消毒是一种比较简单粗暴又有效的手段。通过正则 匹配,过滤请求数据中可能注入的 SQL 文。 如“drop table”、“\b(?:update\b.?\bset|delete\b\W?\bfrom)\b”等。
SQL 预编译参数绑定:使用预编译手段,绑定参数是最好的防 SQL 注入方法。目前许 多数据访问层框架,如 myBatis,Hibernate 等,都实现 SQL 预编译和参数绑定,攻击 者的恶意 SQL 会被当做 SQL 的参数,而不是 SQL 命令被执行。
CSRF 攻击
CSRF 攻击防御手段
表单 Token:CSRF 是一个伪造用户请求的操作,所以需要构造用户请求的所有参数才 可以。表单 Token 就是阻止攻击者获得所有请求参数的可能,在页面表单中增加一个随 机数 Token,每次请求的 Token 都不相同,请求提交后检查 Token 的值是否正确以确 定请求提交者是否合法。
验证码:相对说来,验证码则更加简单有效,即请求提交时,需要用户输入验证码,以 避免在用户不知情的情况下被攻击者伪造请求。但是输入验证码是一个糟糕的用户体验, 所以必要的时候才使用,如支付交易等关键页面。
Referer check:HTTP 请求头的 referer 域中记录着请求来源,可通过检查请求来源, 验证其是否合法。但是该方法有一定局限性,referer 也并不一定总能得到。
其他需要关注的攻击和漏洞
Error Code:也称作错误回显,许多 Web 服务器默认是打开异常信息输出的,即服务器 端未处理的异常堆栈信息会直接输出到客户端浏览器,这种方式虽然对程序调试和错误 报告有好处,但同时也给黑客造成可乘之机。通过故意制造非法输入,使系统运行时出 错,获得异常信息,从而寻找系统漏洞进行攻击。防御手段也很简单,通过配置 Web 服 务器参数,跳转 500 页面(HTTP 响应码 500 表示服务器内部错误)到专门的错误页面即 可,这个功能 Web 应用常用的 MVC 框架也可以做到。
HTML 注释:为了程序调试方便或其他不恰当的原因,有的时候程序开发人员会在 PHP、 JSP 等服务器页面程序中使用 HTML 注释语法进行程序注释,这些 HTML 注释就会显 示在客户端浏览器,给黑客造成攻击便利。程序最终发布前需要进行代码 review 或自动 扫描,避免 HTML 注释漏洞。
文件上传:一般网站都会有文件上传功能,设置头像、分享视频、上传附件等。如果上 传的是可执行的程序,并通过该程序获得服务器端命令执行能力,那么攻击者几乎可以 在服务器上为所欲为,并以此为跳板攻击集群环境的其他机器。最有效的防御手段是设 置上传文件白名单,只允许上传可靠的文件类型。此外还可以修改文件名、使用专门的 存储等手段,保护服务器免受上传文件攻击。
路径遍历:攻击者在请求的 URL 中使用相对路径,遍历系统未开放的目录和文件。防御 方法主要是将 JavaScript、CSS 等资源文件独立服务器、独立域名,其他文件不使用静 态 URL 访问,动态参数不包含文件路径信息。
Web 应用防火墙
开源 Web 应用防火墙 ModSecurity
ModSecurity 是一个开源的 Web 应用防火墙,探测攻击并保护 Web 应用程序,既可以 嵌入到 Web 应用服务器中,也可以作为一个独立的应用程序启动。ModSecurity 最早只 是 Apache 的一个模块,现在已经有 Java、.NET 多个版本,并支持 Nginx。
ModSecurity 采用处理逻辑与规则集合分离的架构模式。处理逻辑负责请求和响应的拦 截过滤,规则加载执行等功能。而规则集合则负责对具体的攻击的规则定义、模式识别、 防御策略等功能。处理逻辑比较稳定,规则集合需要不断针对漏洞进行升级,这是一种 可扩展的架构设计。
网站安全漏洞扫描
网站安全漏洞扫描工具是根据内置规则,模拟黑客攻击行为,用以发现网站安全漏洞的 工具。许多大型网站的安全团队都有自己开发的漏洞扫描工具,不定期的对网站的服务 器进行扫描,查漏补缺。
信息加密技术及密钥安全管理
通常,为了保护网站的敏感数据,应用需要对这些信息进行加密处理,信息加密技术可 分为三类:单项散列加密,对称加密,非对称加密。
单向散列加密
对称加密
非对称加密
高可用系统的度量
可用性指标
网站年度可用性指标=(1-网站不可用时间/年度总时间)×100%
网站不可用时间(故障时间)=故障修复时间点-故障发现(报告)时间点
引起故障的原因
硬件故障
软件 bug
系统发布
并发压力
网络攻击
外部灾害
高可用系统的架构
解耦
高内聚、低耦合的组件设计原则
面向对象基本设计原则
面向对象设计模式
领域驱动设计建模
隔离
业务与子系统隔离
微服务与中台架构
生产者消费者隔离
虚拟机与容器隔离
异步
多线程编程
反应式编程
异步通信网络编程
事件驱动异步架构
备份
集群设计
数据库复制
Failover(失效转移)
数据库主主失效转移
负载均衡失效转移
幂等
服务重复调用有时候是无法避免的,必须保证服务重复调用和调用一次产生的结果相同, 即服务具有幂等性。
事务补偿
传统事务的 ACID
分布式事务的 BASE
事务补偿:通过执行业务逻辑逆操作,使事务回滚到事务前状态
重试
远程服务可能会由于线程阻塞、垃圾回收或者网络抖动,而无法及时返还响应,调用者 可以通过重试的方式修复单次调用的故障。
熔断
当某个服务出现故障,响应延迟或者失败率增加,继续调用这个服务会导致调用者请求 阻塞,资源消耗增加,进而出现服务级联失效,这种情况下使用断路器阻断对故障服务 的调用。
限流
在高并发场景下,如果系统的访问量超过了系统的承受能力,可以通过限流对系统进行 保护。限流是指对进入系统的用户请求进行流量限制,如果访问量超过了系统的最大处 理能力,就会丢弃一部分的用户请求,保证整个系统可用,保证大部分用户是可以访问 系统的。这样虽然有一部分用户的请求被丢弃,产生了部分不可用,但还是好过整个系 统崩溃,所有的用户都不可用要好。
计数器算法(固定窗口,滑动窗口)
令牌桶算法
漏桶算法
降级
有一些系统功能是非核心的,但是它也给系统产生了非常大的压力,比如说在电商系统 中有确认收货这个功能,即便我们不去确认收货,系统也会超时自动确认收货。
但实际上确认收货这个操作是一个非常重的操作,因为它会对数据库产生很大的压力: 它要进行更改订单状态,完成支付确认,并进行评价等一系列操作。如果在系统高并发 的时候去完成这些操作,那么会对系统雪上加霜,使系统的处理能力更加恶化。
解决办法就是在系统高并发的时候,比如说像淘宝双 11 的时候,当天可能整天系统都处 于一种极限的高并发访问压力之下,这时候就可以将确认收货、评价这些非核心的功能 关闭,将宝贵的系统资源留下来,给正在购物的人,让他们去完成交易。
异地多活
如果整个数据中心都不可用,比如说数据中心所在城市遭遇了地震,机房遭遇了火灾或 者停电,这样的话,不管我们的设计和系统多么的高可用,系统依然是不可用的。
为了解决这个问题,同时也为了提高系统的处理能力和改善用户体验,很多大型互联网 应用都采用了异地多活的多机房架构策略,也就是说将数据中心分布在多个不同地点的 机房里,这些机房都可以对外提供服务,用户可以连接任何一个机房进行访问,这样每 个机房都可以提供完整的系统服务,即使某一个机房不可使用,系统也不会宕机,依然 保持可用。
异地多活的难点是数据一致。
高可用的价值观
保持简单,使问题易于发现,快速解决。
目标明确,解决特定环境下的具体问题。
价值回归,成本收益要合理。
版权声明: 本文为 InfoQ 作者【Pyr0man1ac】的原创文章。
原文链接:【http://xie.infoq.cn/article/01f29926c27f71486c63a3ce2】。未经作者许可,禁止转载。
评论