写点什么

架构师训练营 1 期 -- 第十一周总结

用户头像
曾彪彪
关注
发布于: 2020 年 12 月 04 日

常见的 web 攻击与防护

XSS 攻击,攻击者通过链接发送一段脚本给用户,比如攻击者在 URL 中添加一段脚本作为参数,如果页面直接显示这个参数的话,这段脚本会被执行,从而达到攻击的目的。同时攻击者也可以向服务器数据库中插入脚本信息,用户打开页面时,脚本会自动在浏览器执行。比如攻击者通过评论信息插入了脚本信息,然后所有读评论的用户都会执行恶意脚本。

解决方案是对需要显示的文本进行消毒,避免脚本直接运行。


SQL 注入攻击,攻击者在查询条件中构造恶意 SQL 语句,达到攻击的目的。比如在 where name='张三'这个查询语句中,构造 where name='张三'; drop table user;--' 这样的 SQL 语句。

避免 SQL 注入攻击的最好方式是使用 SQL 预处理。常见的 ORM 框架如 Hibernate, Mybatis 都使用了预处理。


CSRF 攻击,是跨站点伪造用户请求攻击。用户登录目标服务器,登录成功后,cookie 被存储。之后用户又访问了攻击服务器,攻击服务器通过构造一个伪请求,伪装成用户访问目标服务器,从而达到攻击的目的。

避免 CSRF 攻击的方法有很多,最常见的是使用服务器产生的 token,用户访问目标服务器时,目标服务器会产生一个 token,用户提交请求时,服务器需要验证这个 token。攻击服务器因为无法获取目标服务器的 token,从而无法伪装成用户。也可以使用验证码,指纹等方式进行校验。


其它要注意的 Web 攻击手段包括:

爆率 ErrorCode,攻击者可能根据你的 ErrorCode 猜测你的代码或者数据表结构,一般需要使用同意的错误提示页面,不应该直接爆率服务器的错误页面,更不应该在出错页面中打印堆栈信息。

文件上传漏洞,如果文件上传后可以直接被执行,那么攻击者可以直接上传一个可执行文件,然后执行,达到攻击服务器的目的。解决方案是设置允许上传文件的类型,使用专门的存储手段等。

相对路径遍历,攻击者在 URL 中输入相对路径,访问服务器上的未开放文件。解决方案是使用独立的文件存储服务器,动态参数不包含文件路径信息等。


Web 攻击是一个通用的安全问题,业界也有一些开源的框架,帮我们去拦截或处理这些攻击请求,如 ModSecurity,另外也可以对自己的网站做安全扫描,自己先测试,是否自己的网站存在以上安全问题。


典型的加解密算法包括单项散列加密,对称加密和非对称加密。

单项散列加密是不可逆的,只能由明文生成密文,无法通过密文获取明文。其应用场景包括密码存储,数字摘要。因为单项散列加密可以通过穷举进行爆破,所以在进行加密时,需要带上一个盐值。

对称加密是可逆的,加密解密用的是同一个密钥,因为其性能高,所以常用于数据加密。

非对称加密也是可逆的,但是使用两个密钥。这种加密算法由两种典型的应用场景。1. 公钥加密,私钥解密,典型的就是 https。2.私钥加密,公钥解密,典型的应用场景是数字签名。


提升系统可用性的架构方案包括:

  • 解耦,降低系统之间的耦合,可以提高系统的可用性。解耦的具体方案包括:高内聚,低耦合的设计原则,面向对象基本设计原则,面向对象设计模式,领域驱动建模等,

  • 隔离,隔离可以降低系统之间的影响。常见的隔离方法包括:业务隔离,子系统隔离。微服务架构,中台架构。生产者与消费者隔离。容器隔离,虚拟机隔离。

  • 备份,当主服务器宕机后,从服务器可以替代主服务器,提高系统可用性。

  • 失效转移,使用备份方案是,重要的是怎样做好失效转移。可以借助 zookeeper 或者 keepalive 这样的框架来实现失效转移。

  • 幂等,也是高可用架构需要考虑的问题,有些服务是天生幂等的,比如修改数据库操作。有些则需要考虑幂等,比如转账操作,可以在消息中加入事务 ID,确保一个事务只被处理一次。

  • 事务补偿。对于分布式系统中,对于失败的事务,可以执行相应的补偿。具体做法是记录每次事务日志,如果事务不成功,则对之前的操作进行逆操作。

  • 重试,对于服务调用失败,可以适当尝试重试。重试需要确保上游服务超时时间>下游超时时间之和。

  • 熔断,是微服务中的一种架构策略。可以避免服务级联失效。

  • 限流,对服务进行保护,防止系统奔溃。限流的策略有很多种,计数器(固定窗口,滑动窗口),令牌桶,漏桶,自适应限流等。

  • 降级,在系统处于高并发访问时,禁止某些非核心服务。

  • 异地多活。当一个数据中心不可用时,请求会发给其它数据中心。其难点是数据一致。


在高可用的运维架构中,发布流程一般是:

  • 从负载均衡节点中剔除一部分服务器,然后对这些服务器进行更新发布。

  • 将新发布的服务器加入到负载均衡服务器中。

  • 再选择其它服务器,重复上面步骤,知道所有服务器更新发布完成。


自动化测试可以极大的降低回归测试的人力成本,自动化测试适合比较稳定的系统。

对于较小的团队,自动化部署反而有优势,可以带来比较好的效果。

为了更好的验证线上产品的正确性,可以创建一个预发布环境,预发布服务器不对外提供服务,却与生产环境配置一样。在系统正式发布之前,先把产品发布到预发布服务器,待验证通过后,在把预发布服务器的代码更新到正式环境。

代码版本管控,有两种代码版本管控的方式。在主干分支上开发,然后创建分支进行发布。或者从主干创建分支分支,开发结束后合并到主干分支,只对主干分支进行发布。一般互联网公司都倾向使用第二种方式,但是也有一个缺点,就是当一个分支开发周期比较长时,会与主干分支有很大区别,解决方案是不断从主干分支拉取最新代码,确保开发分支的代码最新。

灰度发布是每次发布时,只在部分服务器上发布新版本,降低系统升级失败带来的风险。

另外需要对网站性能进行监控,实时获取系统运行状态,尽早发现系统问题。

关于高可用,需要遵守以下原则:

保持简单,使问题易于发现,快速解决。

目标明确,解决特性环境下的系统问题。

价值回归,成本收益要合理。


用户头像

曾彪彪

关注

还未添加个人签名 2019.03.23 加入

还未添加个人简介

评论

发布
暂无评论
架构师训练营 1 期 -- 第十一周总结