写点什么

系统的安全性设计

用户头像
Janenesome
关注
发布于: 2020 年 05 月 08 日
系统的安全性设计

今天来整理一下《大型网站技术架构》中,关于网站安全架构的部分内容。


一、网站应用的攻击与防御

网站攻击应该是非常常见的了,只要开始稍有点流量就会有人盯上你,下面来一起看看常见的攻击手段。

1、XSS 攻击

xss 攻击全称叫跨站点脚本攻击。意思是在用户浏览的网页中,恶意注入代码和执行脚本,控制用户的浏览器进行恶意操作的一种攻击方式。


常见的 xss 攻击类型有两种。一种是反射性,通常是在用户的访问连接中带上恶意代码。用户访问之后执行恶意脚本,或是跳转到恶意网站等等,导致域名在平台中被封禁(例如微信)。严重的还能上报用户的 Cookie、偷取用户的密码等等。


另一种 xss 攻击是持久型 xss 攻击。意思是攻击者将恶意代码保存到被攻击者的服务器里,等其他用户访问的时候执行脚本。这种攻击方式常见于论坛、博客等 UGC 平台中。


像许久以前,论坛网站没有防御意识,用户评论的时候没有过滤和转义 img 标签。就有攻击者把要攻击的网址写在 img 标签里发布在一些热帖上。然后被攻击者的网站流量激增,甚至会打垮服务器。

例如评论:<img src="http://www.baidu.com" /> ,每次有人访问帖子的时候都会访问一次百度。


xss 是一种非常古老的攻击手段了,可是也是最常见的。攻击者不断想出一些新的花样,费尽心思挖网站的漏洞。所以防御手段也是要跟着不断更新。当下主要的防御手段有如下几种:

消毒

对用户的输入内容(UGC、地址栏参数等等)进行过滤和转义,例如 “>”转义成 “&gt;” 等等。

一般来说都没问题,因为这类字符是用户输入时不常用的,可是也要避免错误地转义,例如 “10>2”等。

消毒这个手段是现在几乎所有网站都必备的 xss 防御手段了,再加上现在很多前端框架都会统一对输出到页面的字符串进行转义,这个防御手段成本也是很低,性价比很高的。

HttpOnly

这个手段,主要是为了防止恶意脚本偷取用户的 Cookie 。对于一些敏感信息的 Cookie ,可以加上这个 HttpOnly 属性,这样 JavaScript 就访问不了这个 Cookie 了。

CSP

内容安全策略(白名单\黑名单 过滤),告诉浏览器只能(或不能)加载和执行哪些域名的脚本。

2、注入攻击

注入攻击主要分 SQL 注入攻击和 OS 注入攻击。


SQL 注入需要攻击者对数据库结构有所了解才能进行,攻击者获取数据库表结构的主要手段有如下几种:

开源

某些开源软件搭建的网站,网站数据库结构有可能会被公开。

详细错误的回显

如果服务器 500 的详细错误信息显示到浏览器上,则有可能会被攻击者利用。攻击者可以故意构造非法参数,使服务端异常信息输出到浏览器端,从而猜测数据库表结构。这个也是很多网站开发没有注意的点。

盲猜

网站关闭了错误回显,攻击者构造不同的参数观察页面的变法,据此猜测数据表结构。不过这种方式难度较大。


那么,SQL 注入攻击的防御手段,首先就是避免让攻击者猜测到数据库结构;然后就是防止直接使用用户的输入来构建 SQL 语句。主要有如下手段:

消毒

通过正则等手段,过滤和转义可能注入的 SQL 字段,例如 “drop table”等等。

参数绑定

使用预编译手段( Preparedstatement)、绑定参数是最好的 SQL 攻击预防方法。服务器会把用户的输入当成一个完整的查询参数来执行,而不会被截断和注入。现在很多框架都实现了这种防御手段。

3、CSRF 攻击

全称是跨站点请求伪造,攻击者通过跨站请求,假装是合法用户来进行非法操作,如转账交易、发表评论、关注某人等。其核心是利用了浏览器 Cookie 或服务器的 Session 策略,盗取用户身份。

CSRF 攻击


因此,CSRF 的防御手段主要是识别请求者的身份。主要有如下几种手段:

表单 Token

CSRF 伪造请求,需要伪造用户请求的所有参数。我们可以通过一个短期失效的 Token 参数来检查请求者的合法性,而伪造者的请求是无法获得该值的。

验证码

验证码简单有效,不过用户体验比较差。通常只用在关键的步骤里。

Referer check

检查 HTTP 请求头中的 Referer 来源是否合法。很多网站用这个功能来实现图片或资源的防盗链。

4、其他攻击和漏洞

还有一些常见的攻击手段如下:

错误回显

详细的错误信息,会被攻击者利用来寻找系统漏洞。可以通过配置专门的错误页面来避免这种情况。

HTML 注释

攻击者 F12 就能看到你的注释,更好地理解了代码逻辑,从而更好地寻找系统的漏洞。甚至有些代码直接就把漏洞写在了注释里,例如:目前有 xxx 漏洞,先临时处理,待优化 等等。

文件上传

攻击者通过上传可执行的文件,然后在被攻击者的服务器里为所欲为。防御手段有两种,最好的手段是设置文件上传白名单,只允许上传可靠的文件类型。另一种是使用专门的储存手段、修改文件名称等手段来避免文件的执行。

5、Web 应用防火墙

在应用服务之前部署多一层,对请求先进行一层拦截。命中攻击规则的请求,直接就拦截掉,不再进应用服务。

6、网站安全漏洞扫描

构造具有攻击性的 URL 请求,模拟攻击行为,试探漏洞。


二、信息加密技术

信息加密技术可以分为三类:单向散列加密、对称加密和非对称加密。

1、单向散列加密

常见的例如 MD5、SHA 等。对不同输入长度的信息进行散列计算,得到固定长度的输出。这种加密是单向的,也即是说不能通过对固定长度的输出值计算从而获得输入信息。不过现在有彩虹库,攻击者可以对照常见字符对应的密文来暴力破解,为防止被暴力破解,我们还会给算法进行加盐加密( salt )。


常见的场景有保存用户密码等,这样哪怕信息暴露也是暴露加密之后的密文。

还有就是用来做信息摘要、计算高离散程度的随机数等用途,因为单向散列算法的一个特点就是输入的任何微小变化都会导致输出的完全不同。

2、对称加密

对称加密通常用在信息需要安全交换或储存的场合,例如 Cookie 加密、通信加密等。

优点是算法简单,加解密效率高,系统开销小,适合对大量数据加密。缺点是加解密使用同一个密钥,如果在远程通信中暴露了密钥,那么所有的加密都没有意义了。


常用的加密算法有 DES、RC 算法等。对称加密是最常用的加密手段,适用于绝大多数场合。

3、非对称加密

非对称加密有一个公钥、一个私钥,公钥对外公开,而私钥只有服务提供者才知道。用公钥加密的信息必须用私钥才能解开,反之,用私钥加密的信息必须用公钥才能解开。

非对称加密常用在信息安全传输、数字签名等场合。


数字签名:签名者用自己的私钥加密信息后传输给对方,对方使用公钥解密后获得明文信息。因为私钥只有签名者有,因此信息不会被篡改,所以具有签名的性质。


因为非对称加密的性能和效率不如对称加密,在实际应用中,常常会混合使用对称加密和非对称加密。

例如 HTTPS 传输,先使用非对称加密来进行密钥的传输,因为非对称加密的安全性,能减少密钥被篡改或偷取的风险,然后使用对称加密手段来传输信息。


三、密钥的安全管理

加密传输过程中,能安全保密的重要前提是密钥的安全。不管是单向散列加密中用到的 salt、对称加密的密钥、还是非对称加密的私钥。如果这些密钥泄露了,则加密就毫无意义了。


实际开发中,很多工程师会把密钥直接写在源代码中,甚至直接 F12 就能看到密钥。好一些的会写到配置文件中,不同环境配置不同的密钥,可是还是有很大的泄露风险。


改善密钥安全管理的手段,主要有如下几种:

1、使用单独部署的密钥服务

用一个单独的服务,对外提供加密解密服务,密钥只在这个服务中管理。不过这种方式成本较高,需要额外的远程调用,开销较大,可能会成为系统应用的瓶颈所在。

2、密钥分片独立储存

加解密算法放在应用系统中,密钥则放在独立的服务器中。完整的密钥被分片储存在不同的介质中,被不同职责的人管理,没有人能查看完整的密钥信息。应用系统需要用的时候就去请求密钥,并缓存在应用本地。

密钥安全管理



最后,攻击手段是时时都在更新的。对应的,每一种防御手段都不是一劳永逸的。网站安全问题是我们每天都要面对的。平时开发中需要提高安全的意识。

用户头像

Janenesome

关注

功不唐捐 2018.10.29 加入

程序员

评论

发布
暂无评论
系统的安全性设计