第8章:固若金汤:网站的安全架构

概述

从互联网诞生起,安全威胁就一直伴随着网站的发展, 各种Web攻击和信息泄露也从未停止。 2011年中国互联网领域爆出两桩比较大的安全事故, 一桩是新浪微博遭XSS攻击, 另一桩是以CSDN为代表的多个网站泄露用户密码和个人信息。

道高一尺魔高一丈的网站应用攻击与防御

攻击新浪微博的手段被称作XSS攻击,它和SQL注入攻击构成网站应用攻击最主要的两种手段,全球大约70%的Web应用攻击都来自XSS攻击和SQL注入攻击。 此外,常用的Web应用还包括CSRF、 Session劫持等手段。

XSS攻击

XSS攻击即跨站点脚本攻击(Cross Site Script),指黑客通过篡改网页,注入恶意HTML脚本,在用户浏览网页时,控制用户浏览器进行恶意操作的一种攻击方式。

常见的XSS攻击类型有两种:

  1. 反射型:攻击者诱使用户点击一个嵌入恶意脚本的链接达到攻击的目的。
    • 以新浪微博为例,攻击者发布的微博中有一个含有恶意脚本的URL, 用户点击该URL, 脚本会自动关注攻击者的新浪微博ID,发布含有恶意脚本URL的微博,攻击就被扩散了。
    • 采用XSS攻击,偷取用户Cookie、密码等重要数据,进而伪造交易、盗窃用户财产、窃取情报。

  1. 持久型XSS攻击:黑客提交含有恶意脚本的请求,保存在被攻击的Web站点的数据库中,用户浏览网页时, 恶意脚本被包含在正常页面中, 达到攻击的目的。

HttpOnly

对于存放敏感信息的Cookie, 如用户认证信息等,可通过对该Cookie添加HttpOnly属性,避免被攻击脚本窃取

注入攻击

注入攻击主要有两种形式,SQL注入攻击和OS注入攻击。

攻击者在HTTP请求中注入恶意SQL命令(drop table users;) ,服务器用请求参数构造数据库SQL命令时,恶意SQL被一起构造,并在数据库中执行。

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

  1. 开源
    • 如果网站采用开源软件搭建, 如用Discuz!搭建论坛网站,那么网站数据库结构就是公开的, 攻击者可以直接获得。
  2. 错误回显
    • 如果网站开启错误回显,即服务器内部500错误会显示到浏览器上。 攻击者通过故意构造非法参数, 使服务端异常信息输出到浏览器端, 为攻击猜测数据库表结构提供了便利。
  3. 盲注
    • 网站关闭错误回显,攻击者根据页面变化情况判断SQL语句的执行情况, 据此猜测数据库表结构, 此种方式攻击难度较大。防御SQL注入攻击首先要避免被攻击者猜测到表名等数据库表结构信息, 此外还可以采用如下方式。
  4. 消毒
    • 和防XSS攻击一样,请求参数消毒是一种比较简单粗暴又有效的手段。通过正则匹配,过滤请求数据中可能注入的SQL, 如“drop table”、 “\b(?:update\b.?\bset |delete\b\W?\bfrom) \b”等。
  5. 参数绑定
    • 使用预编译手段,绑定参数是最好的防SQL注入方法。 目前许多数据访问层框架, 如IBatis, Hibernate等, 都实现SQL预编译和参数绑定, 攻击者的恶意SQL会被当做SQL的参数, 而不是SQL命令被执行。

除了SQL注入, 攻击者还根据具体应用,注入OS命令、编程语言代码等, 利用程序漏洞, 达到攻击目的。

CSRF攻击

CSRF(Cross Site Request Forgery, 跨站点请求伪造) ,攻击者通过跨站请求,以合法用户的身份进行非法操作, 如转账交易、发表评论等。

CSRF的主要手法是利用跨站请求,在用户不知情的情况下, 以用户的身份伪造请求。 其核心是利用了浏览器Cookie或服务 器Session策略, 盗取用户身份。

CSRF的防御手段主要是识别请求者身份。 主要有下面几种方法。

  • 表单Token
    • CSRF是一个伪造用户请求的操作, 所以需要构造用户请求的所有参数才可以。 表单Token通过在请求参数中增加随机数的办法来阻止攻击者获得所有请求参数: 在页面表单中增加一个随机数作为Token, 每次响应页面的Token都不相同, 从正常页面提交的请求会包含该Token值, 而伪造的请求无法获得该值, 服务器检查请求参数中Token的值是否存在并且正确以确定请求提交者是否合法。
  • 验证码
    • 验证码则更加简单有效, 即请求提交时, 需要用户输入验证码, 以避免在用户不知情的情况下被攻击者伪造请求。 但是输入验证码是一个糟糕的用户体验, 所以请在必要时使用, 如支付交易等关键页面。
  • Referer check
    • HTTP请求头的Referer域中记录着请求来源, 可通过检查请求来源, 验证其是否合法。 很多网站使用这个功能实现图片防盗链(如果图片访问的页面来源不是来自自己网站的网页就拒绝) 。

其他攻击和漏洞

除了上面提到的常见攻击, 还有一些漏洞也常被黑客利用。

  1. Error Code

    • 也称作错误回显,许多Web服务器默认是打开异常信息输出的,即服务器端未处理的异常堆栈信息会直接输出到客户端浏览器,这种方式虽然对程序调试和错误报告有好处, 但同时也给黑客造成可乘之机。通过故意制造非法输入,使系统运行时出错,获得异常信息,从而寻找系统漏洞进行攻击。防御手段也很简单, 通过配置Web服务器参数, 跳转500页面(HTTP响应码500表示服务器内部错误)到专门的错误页面即可,Web应用常用的MVC框架也有这个功能。
  2. HTML注释

    • 为调试程序方便或其他不恰当的原因, 有时程序开发人员会在PHP、 JSP等服务器页面程序中使用HTML注释语法进行程序注释, 这些HTML注释就会显示在客户端浏览器, 给黑客造成攻击便利。 程序最终发布前需要进行代码review或自动扫描, 避免HTML注释漏洞。
  3. 文件上传

    • 一般网站都会有文件上传功能, 设置头像、 分享视频、 上传附件等。 如果上传的是可执行的程序, 并通过该程序获得服务器端命令执行能力, 那么攻击者几乎可以在服务器上为所欲为, 并以此为跳板攻击集群环境的其他机器。 最有效的防御手段是设置上传文件白名单, 只允许上传可靠的文件类型。 此外还可以修改文件名、 使用专门的存储等手段, 保护服务器免受上传文件攻击。
  4. 路径遍历

    • 攻击者在请求的URL中使用相对路径, 遍历系统未开放的目录和文件。 防御方法主要是将JS、 CSS等资源文件部署在独立服务器、 使用独立域名, 其他文件不使用静态URL访问, 动态参数不包含文件路径信息。

Web应用防火墙

ModSecurity是一个开源的Web应用防火墙, 探测攻击并保护Web应用程序, 既可以嵌入到Web应用服务器中, 也可以作为一个独立的应用程序启动。

网站安全漏洞扫描

网站安全漏洞扫描工具是根据内置规则,构造具有攻击性的URL请求,模拟黑客攻击行为,用以发现网站安全漏洞的工具。 许多大型网站的安全团队都有自己开发的漏洞扫描工具, 不定期地对网站的服务器进行扫描, 查漏补缺 。 市场上也有很多商用的网站安全漏洞扫描平台。

信息加密技术及密钥安全管理

为了保护网站的敏感数据,应用需要对用户数据等信息进行加密处理,信息加密技术可分为三类**:单项散列加密、对称加密和非对称加密**。

单向散列加密

单向散列加密是指通过对不同输入长度的信息进行散列计算,得到固定长度的输出,这个散列计算过程是单向的,即不能对固定长度的输出进行计算从而获得输入信息。

对称加密

所谓对称加密是指加密和解密使用的密钥是同一个密钥(或者可以互相推算)

非对称加密

不同于对称加密, 非对称加密和解密使用的密钥不是同一密钥,其中一个对外界公开,被称作公钥,另一个只有所有者知道,被称作私钥。 用公钥加密的信息必须用私钥才能解开。反之,用私钥加密的信息只有用公钥才能解开。理论上说,不可能通过公钥计算获得私钥。

在实际应用中,常常会混合使用对称加密和非对称加密。先使用非对称加密技术对对称密钥进行安全传输,然后使用对称加密技术进行信息加解密与交换。

信息过滤与反垃圾

在各种社区网站和个人邮箱中,广告和垃圾信息仍然屡见不鲜、泛滥成灾。常用的信息过滤与反垃圾手段有以下几种。

文本匹配

文本匹配主要解决敏感词过滤的问题。通常网站维护一份敏感词列表,如果用户发表的信息含有列表中的敏感词,则进行消毒处理(将敏感词转义为***) 或拒绝发表。

分类算法

基于贝叶斯分离算法(利用概率统计),对事物进行分类。

分类算法除了用于反垃圾, 还可用于信息自动分类, 门户网站可用该算法对采集来的新闻稿件进行自动分类, 分发到不同的频道。 邮箱服务商根据邮件内容推送的个性化广告也可以使用分类算法提高投送相关度。

黑名单

对于垃圾邮件,除了用分类算法进行内容分类识别,还可以使用黑名单技术,将被报告的垃圾邮箱地址放入黑名单,然后针对邮件的发件人在黑名单列表中查找,如果查找成功, 则过滤该邮件。(布隆过滤器的应用)

黑名单也可用于信息去重, 如将文章标题或者文章关键段落记录到黑名单中, 以减少搜索引擎收录重复信息等用途。

风险

电子商务具有多种形式,B2B、B2C、C2C每种交易的场景都不相同,风险也各有特点,大致可分为以下几种。

  1. 账户风险: 包括账户被黑客盗用, 恶意注册账号等几种情形。
  2. 买家风险: 买家恶意下单占用库存进行不正当竞争; 黄牛利用促销抢购低价商品; 此外还有良品拒收, 欺诈退款及常见于B2B交易的虚假询盘等。
  3. 卖家风险: 不良卖家进行恶意欺诈的行为, 例如货不对板, 虚假发货, 炒作信用等, 此外还有出售违禁商品、 侵权产品等。
  4. 交易风险: 信用卡盗刷, 支付欺诈, 洗钱套现等。

风控

大型电商网站都配备有专门的风控团队进行风险控制,风控的手段也包括自动和人工两种。 机器自动识别为高风险的交易和信息会发送给风控审核人员进行人工审核,机器自动风控的技术和方法也不断通过人工发现的新风险类型进行逐步完善。机器自动风控的技术手段主要有规则引擎和统计模型。

  1. 规则引擎
    • 当交易的某些指标满足一定条件时,就会被认为具有高风险的欺诈可能性。比如,用户来自欺诈高发地区;交易金额超过某个数值;和上次登录的地址距离差距很大;用户登录地与收货地不符;用户第一次交易等等

  1. 统计模型

规则引擎虽然技术简单,但是随着规则的逐渐增加,会出现规则冲突,难以维护等情况,而且规则越多,性能也越差。

目前大型网站更倾向于使用统计模型进行风控。风控领域使用的统计模型使用前面提到的分类算法或者更复杂的机器学习算法进行智能统计。

经过充分训练后的统计模型,准确率不低于规则引擎。分类算法的实时计算性能更好一些, 由于统计模型使用模糊识别, 并不精确匹配欺诈类型规则, 因此对新出现的交易欺诈还具有一定预测性。

文章来源

  • 作者:李智慧
  • 来源:《大型网站技术架构》