汪冰 黄银蓉
摘要:数据库技术在计算机网络和互联网络中起着至关重要的作用。在各种web应用场景下,都有数据库技术参与。SQL Server、Access、Oracle、MySQL等一系列数据库管理系统被广泛使用。作为web应用结构中的存储层,数据库服务器通过web应用服務器与浏览器之间完成数据交互。在交互过程中经常会面对各种网络安全风险,其中以SQL注入攻击最为普遍。本文对数据库安全基本要求、web应用中数据库运转原理进行论述,阐述了国内外对数据库系统运行安全和数据库系统信息安全的相关标准;以C/S模式为例,说明了web应用的三层架构。本文以SQL Server为例,列举并实践了几种常见的SQL注入语句;利用自动注入工具SQLMap对特定网站进行SQL注入。本文以ASP等编程语言为例,简单介绍了几种行之有效并被广泛使用的SQL注入防御手段。
关键词:数据库安全;web应用;SQL注入;SQL注入防御
1.数据库安全基本要求及威胁来源
数据库及其相关技术在快速发展的计算机、互联网应用中起着至关重要的作用。几乎所有常见的网站、web应用程序和移动终端应用程序都运用了数据库及其相关技术。数据库的定义是按照数据结构来组织、存储和管理数据的仓库。它于20世纪60年代出现并伴随着计算机和互联网技术地快速演变在20世纪90年代后期得到迅速发展。在其发展的早期,与数据库安全相关的防护技术并未受到业界重视。但随着计算机和互联网的普及,大量合法或不合法的用户涌入网络当中,对网络安全产生了巨大冲击,于是业界开始关注网络安全防护技术,而数据库安全技术则属于网络安全防护技术当中十分重要的一个环节。
关于数据库安全的定义,国内外有不同的定义。国外以C. P. Pfleeger 在“Security in Computing – Database Security. PTR,1997”中对数据库安全的定义最具有代表性,被国内外许多教材、论文和培训广泛应用。他从以下方面对数据库安全进行了描述:
(1)物理数据库的完整性:数据库中的数据不被各种自然的或物理的问题而破坏,如电力问题或设备故障等。
(2)逻辑数据库的完整性:对数据库结构的保护,如对其中一个字段的修改不应该破坏其他字段。
(3)元素安全性:存储在数据库中的每个元素都是正确的。
(4)可审计性:可以追踪存取和修改数据库元素的用户。
(5)访问控制:确保只有授权的用户才能访问数据库,这样不同的用户被限制在不同的访问方式。
(6)身份验证:不管是审计追踪或者是对某一数据库的访问都要经过严格的身份验证。
(7)可用性:对授权的用户应该随时可进行应有的数据库访问。
我国在数据库安全方面也有自己的定义,在《中华人民共和国公共安全行业标准GA/T389-2002》中“计算机信息系统安全等级保护数据库管理系统技术要求”部分对数据库安全的定义是:数据库安全就是保证数据库信息的保密性、完整性、一致性和可用性。保密性指保护数据库中的数据不被泄露和未授权的获取;完整性指保护数据库中的数据不被破坏和删除;一致性指确保数据库中的数据满足实体完整性、参照完整性和用户定义完整性要求;可用性指确保数据库中的数据不因人为的和自然的原因对授权用户不可用。其中保密性、完整性及可用性与信息安全三要素“CIA”相一致。
在实际生产应用过程中,数据库一般由数据库管理系统来统一管理和控制,用户可以通过数据库管理系统访问数据库,数据库管理员也可以通过它进行数据库的维护工作。常见的SQL Server、Access、Oracle、MySQL等都属于数据库管理系统。而我们所讨论的数据库安全技术主要就是针对数据库管理系统的。数据库管理系统的安全既要考虑数据库管理系统的安全运行保护,也要考虑对数据库管理系统中所存储、传输和处理的数据信息的保护(包括以库结构形式存储的用户数据信息和以其他形式存储的由数据库管理系统使用的数据信息)。由于攻击和威胁既可能是针对数据库管理系统运行的,也可能是针对数据库管理系统中所存储、传输和处理的数据信息的保密性、完成性和可用性的,所以对数据库管理系统的安全保护的功能要求,需要从系统安全运行和信息安全保护两方面综合进行考虑。系统运行安全和系统信息安全即是数据库安全所包含的两层含义。系统运行安全一般面临着数据库管理系统本身可用性被破坏的威胁。网络中的不法分子通过各种渗透技术入侵服务器,通过病毒、木马等手段致使系统无法正常运转,从而造成破坏性的后果;系统信息安全则主要包含保密性和完整性两个方面的内容。网络中的不法分子通过注入技术取得数据库中的各种用户数据,甚至可以通过代码控制对数据进行恶意删除和修改,严重破坏数据信息的安全。
数据库一般不会独立存在于互联网和计算机网络之中,而是通常作为web应用系统和web应用程序的后端驱动技术而存在。常见的web应用系统有办公自动化系统、电子邮件系统、新闻网站、电子商城等;而常见的web应用程序则更为普遍,我们的移动终端上琳琅满目的应用软件后端几乎都有数据库技术在支撑其运转。图1说明了web应用和数据库服务器之间的简单交互关系(这里只针对C/S模式):
从图1可以看到,用户在使用各种web应用系统或web应用程序的时候,首先通过终端设备向web应用服务器发起数据请求,web应用服务器收到该请求以后再向数据服务器发起数据请求,数据服务器收到请求后返回响应数据至web应用服务器,web应用服务器收到响应数据后再反馈给终端设备。整个交互过程时间非常短暂,用户一般不会察觉。但在交互过程中存在多处安全威胁,因此通信运营商和各类互联网服务提供商必须在关键节点做好安全防护工作,避免发生网络信息安全事故。而在众多安全防护工作中,数据库安全尤为重要,在图中的网络环境下,我们可以将数据库安全分为3个层次,分别为网络安全、服务器安全和数据库本身的安全。网络安全侧重于防护数据交互过程中的网络嗅探、跨站脚本攻击、缓冲区溢出攻击、DDOS攻击等;服务器安全侧重于操作系统本身的安全,防护手段主要包括安装正版操作系统、及时升级补丁、严格控制管理员账户权限、在关键节点架设防火墙等;数据库安全侧重于通过代码审计、数据加密、数据备份、用户权限控制等方式避免网络不法分子对数据运行安全和数据信息安全造成破坏。
在数据库安全面临的众多威胁中,SQL注入是最为典型、破坏性最强的攻击方式。在论述SQL注入以前,先对SQL进行一个简单介绍。SQL最早源于1974年IBM公司圣约瑟研究室研制的大型关系数据库管理系统System R,其中包括了一套规范的数据库语言——SEQUEL(Structured English Query Language),后于1980年正式更名为SQL。SQL按照功能一般分为四大类,分别是查询语言(Data Query Language,DQL)、数据操作语言(Data Manipulation Language,DML)、数据定义语言(Data Definition Language,DDL)和数据控制语言(Data Control Language,DCL),详见图2:
2.Web应用中的数据库运用原理
从图1中我们已经简单了解了web应用的基本架构。主要分为表示层、逻辑层和存储层(数据层)。展示web页面的浏览器就位于表示层。表示层是web应用的最高层,一般由用HTML(HyperText Markup Language,超文本标记语言)等语言编写的便于用户查看的页面组成。其主要作用就是与用户进行交互,或者说使用便于用户理解、查看的方式将后台数据呈现给用户;逻辑层位于表示层与数据层之间,在数据交换中起承上启下的作用,是三层架构中的核心部分,其主要功能是负责在浏览器和后台数据库之间建立交互关系,将浏览器送来的请求指令进行加工处理后发送至数据库,同时将数据库反馈回来的数据信息加工处理后传递给浏览器;数据层一般包括数据库服务器、存储数据的存储设备和数据信息本身,所以数据层通常也被叫做存储层。数据层的主要功能是负责数据的存储和检索,一般数据库服务器支持访问数据库文件、二进制文件、文本文档或是XML文档。图3将图1进行了细化,详细展示了web应用的工作原理:
当用户通过浏览器访问某一个网站时,浏览器会将用户输入的URL发送至web应用服务器,web应用服务器将URL进行编译处理,生成特定的SQL语句并发送至数据库服务器执行,之后数据库服务器返回数据信息至web应用服务器,web应用服务器再将数据信息加工处理为HTML并递送至浏览器呈现给用户。下面看一个实例:
我们通过火狐浏览器访问了URL为http://www.aodiweixiu.com/about.asp?id=1的网页,在这段URL中除了.com的域名外,后面还出现了“asp?id=1”这串代码,这其中就涉及到浏览器和后台服务器之间的参数传递。通过这个参数输入节点,我们就可以通过构造特定的SQL语句对该网站的后台数据库进行手工注入,或者直接使用自动注入工具进行SQL注入,以破坏该网站数据信息的“CIA”三要素。
3.QL注入的防御及数据库访问控制
SQL注入攻击严重威胁着数据库的安全,因此,在web应用程序设计和编写的时候必须采用必要的防护手段,避免数据库中的重要信息被网络中的不法分子窃取。我们可以通过以下三种常见方法对SQL注入攻击进行防御。
3.1输入验证防御。
输入验证一般分为白名单验证和黑名单验证两种方式。白名单验证首先建立起白名单规则,即确定包含在规则内的数据全部通过,否则便丢弃或拒绝访问;黑名单验证正好相反,首先建立黑名单规则,在规则内的数据禁止通过。白名单验证的防护强度一般高于黑名单验证,在较为重要的数据库上都应该建立白名单规则。
代码实现的功能非常简单,就是对用户输入的用户名和密码的数据类型和字符串长度进行校验。如果用户输入了不满足校验要求的数据,比如“and1=1”、“'or‘1’=’1’”等常见的登录SQL注入代码,就会提示错误并拒绝请求。这样就避免了带有SQL注入功能的SQL语句被送至数据库服务器中执行,即在数据库服务器以外就将不合法的输入拒绝掉。
3.2代码过滤防御。
SQL注入产生的根本原因是不法用户修改了程序员预先设计好的SQL语句结构。根据前文的内容可以发现,SQL注入语句基本都包含得有各种非法字符串、数字和符号。如果我们通过编写特定代码,将用户提交的数据表单中不合法的内容过滤掉,即可有效避免SQL注入攻击。但是,在过滤的时候必须遵循一定的原则,不能错将原本合法的SQL语句中的字符也过滤掉,否则将无法实现web应用程序的基本功能。比如在所有SQL注入中都存在“空格”符号,但是却不能简单粗暴地把用户提交的数据中的空格都过滤掉,因为在英文字符串中,空格本身就是合法输入的一部分。我们通常的做法是用“{#space}”来替换用户输入的空格,在浏览器呈现数据之前再进行反替换。
4.结束语
本文就数据库安全基本要求、SQL注入的基本原理和防护手段进行了讨论。SQL语句作为关系型数据库的核心执行代码,长期以来都面临这巨大的网络安全挑战,网络安全从业人员必须紧随时代发展趋势和不断变化的安全需求,不断推进数据库安全性的提升。
参考文献:
[1] HE Guiying, ZHOU jie, WANG lv.Database Security Technology. (2017)321740.
[2] Abraham Silberschatz, Henry F.Korth, S.Sudarshan. Database System Concepts.01-2010-3824.
[3] Ma jun, Duan xinglin. Analysis and prevention of SQL injection in Web application system.1009-2552(2015) 08-0071-0。10.13274 /j. cnki. hdzj.2015.08.019.
[4] Wu Pufeng, Zhang yuqing. An Overview of Database Security. 1000—3428(2006)12—0085—04。TP309.2.2006-6.
(廣安职业技术学院)