向磊
摘要:该文首先介绍了SQL注入攻击的原理,对SQL注入攻击进行了分析。同时根据笔者的日常工作经验总结除了一套比较完善的SQL注入防范体系,并且根据SQL注入攻击的原理以及不同的防范技术,提出了基于客户端和服务器端的双向SQL注入攻击的防御模型。
关键词:SQL注入攻击;SQL攻击防范;防御模型
中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2017)25-0001-02
网络安全是信息化的重要基石。网络信息涉及国家的军事、政府、经济等领域及公民的个人信息,其中许多信息是敏感信息,甚至是机密信息,而层出不穷的各种安全漏洞和不断变化的攻击手段,使得网络和信息安全面临艰巨挑战。
目前,针对Web应用程序和数据库的攻击已成为网络安全隐患的主要方面,其具有技术门槛低、可绕过安全设备、攻击回报高等特点。据开放Web应用程序安全项目近些年的统計中,注入问题仍然是影响网络安全最严重的漏洞。在许多安全论坛,SQL注入攻击也是热点话题之一,对SQL注入问题的研究非常重要。
1 SQL注入攻击原理
SQL 注入攻击是一种攻击数据库的常见攻击,主要是由于程序员在编写程序代码时,没有对输入数据的合法性进行判断,导致网页程序存在安全漏洞。[1]黑客会通过提交一些数据库查询代码或者其他恶意代码,然后根据程序返回的结果进行判断分析,从而获得数据库中黑客需要的信息。SQL注入主要是从80端口进行访问,而且现在很多市面上的防火墙一般不会对SQL注入发出警报,如果网络管理员没有经常查看IIS日志,可能被入侵长时间都不会发现。因此SQL注入攻击行为是非常隐蔽的,难以被检测发现。
2 SQL注入的实例分析
这段SQL查询语句是正确的,但是代码中的“username”和“passWord”这2个值都是用户登录提交的。程序员没有对用户提交的2个参数值进行判断,从而留下了漏洞。攻击者可以通过修改构造提交任意的数据信息。例如用户进行如下的输入:用户输入为空,在密码输入如下代码:';' drop table users-。信息提交成功后,网站会提示登录失败。但真正网站执行的不仅是提示登录失败,也将数据库中表users也被删除,当用户再次输入正确用户名和密码后,将出现如下提示信息。用户表被删除后,任何用户都不能进行登录。具体效果如图1所示。
3 SQL注入攻击的防范和模型
3.1 SQL注入攻击的防范
SQL注入攻击的危害很大,而且防火墙很难对攻击行为进行拦截,那么该如何来防治呢?本文对主要的SQL注入攻击防范方法进行了总结,具体有以下几个方面。
1) 分级管理
对用户进行分级管理,严格控制用户的权限,对于普通用户,禁止给予数据库建立、删除、修改等相关权限,只有系统管理员才具有增、删、改、查的权限。例如上述实例中用户在查询语句中加入了drop table。肯定是不能让其执行的,否则系统的数据库安全性就无法保障。故而通过权限的设计限制。使得即使恶意攻击者在数据提交时嵌入了相关攻击代码。但因为设置了权限,从而使得代码不能执行。从而减少SQL注入对数据库的安全威胁。
2) 参数传值
程序员在书写SQL语言时,禁止将变量直接写入到SQL语句,必须通过设置相应的参数来传递相关的变量。从而抑制SQL注入。数据输入不能直接嵌入到查询语句中。同时要过滤输入的内容,过滤掉不安全的输入数据。或者采用参数传值的方式传递输入变量。这样可以最大程度防范SQL注入攻击。
3) 基础过滤与二次过滤
SQL注入攻击前,入侵者通过修改参数提交“and”等特殊字符,判断是否存在漏洞,然后通过select、update等各种字符编写SQL注入语句。因此防范SQL注入要对用户输入进行检查,确保数据输入的安全性,在具体检查输入或提交的变量时,对于单引号、双引号、冒号等字符进行转换或者过滤,从而有效防止SQL注入。下面是一个ID变量的过滤代码,如图2所示:
当然危险字符有很多,在获取用户输入提交的参数时,首先要进行基础过滤,然后根据程序的功能及用户输入的可能性进行二次过滤,以确保系统的安全性。
4) 使用安全参数
SQL数据库为了有效抑制SQL注入攻击的影响。在进行SQLServer数据库设计时设置了专门的SQL安全参数。在程序编写时应尽量使用安全参数来杜绝注入式攻击。从而确保系统的安全性。
SQLServer数据库提供了Parameters集合,它在数据库中的功能是对数据进行类型检查和长度验证,当程序员在程序设计时加入了Parameters集合,系统会自动过滤掉用户输入中的执行代码,识别其为字符值。如果用户输入中含有恶意的代码,数据库在进行检查时也能够将其过滤掉。同时Parameters集合还能进行强制执行检查。一旦检查值超出范围。系统就会出现异常报错,同时将信息发送系统管理员,方便管理员做出相应的防范措施。图3是Parameters 集合的应用实例。
在这个例子中,参数@au_id被Parameters集合识别为字符值。同时对这个字符值进行长度和类型检查。一旦该字符值不符合对应的类型和长度,程序就会引发异常,从而留下相应的日志,方便系统管理员查看和及时防范。
5) 漏洞扫描
为了更有效地防范SQL注入攻击,作为系统管理除了设置有效的防范措施,更应该及时发现系统存在SQL攻击安全漏洞。系统管理员可以通过采购一些专门系统的SQL漏洞扫描工具,通过专业的扫描工具,可以及时的扫描到系统存在的相应漏洞。虽然漏洞扫描工具只能扫描到SQL注入漏洞,不能防范SQL注入攻击。但系统管理员可以通过扫描到的安全漏洞,根据不同的情况采取相应的防范措施封堵相应的漏洞,从而把SQL注入攻击的门给关上。从而确保系统的安全。endprint
6) 多层验证
现在的网站系统功能越来越庞大复杂。为确保系统的安全,访问者的数据输入必须经过严格的验证才能进入系统,验证没通过的输入直接被拒绝访问数据库,并且向上层系统发出错误提示信息。同时在客户端访问程序中验证访问者的相关输入信息,从而更有效的防止简单的SQL注入。但是如果多层验证中的下层如果验证数据通过,那么绕过客户端的攻击者就能够随意访问系统。因此在进行多层验证时,要每个层次相互配合,只有在客户端和系统端都进行有效的验证防护,才能更好地防范SQL注入攻击。
7) 数据库信息加密
传统的加解密的方法大致可以分为三种:
(1) 对称加密:即加密方和解密方都使用相同的加密算法和密钥,这种方案的密钥的保存非常关键,因为算法是公开的,而密钥是保密的,一旦密匙泄露,黑客仍然可以轻易解密。常见的对称加密算法有:AES、DES等。[2]
(2) 非对称加密:即使用不同的密钥来进行加解密,密钥被分为公钥和私钥,用私钥加密的数据必须使用公钥来解密,同样用公钥加密的数据必须用对应的私钥来解密,常见的非对称加密算法有:RSA等。
(3) 不可逆加密:利用哈希算法使数据加密之后无法解密回原数据,这样的哈希算法常用的有:md5、SHA-1等。
但对于数据库系统安全角度来讲,我们有迫切的需求采用更好的方法对密码数据进行不可逆加密,通常的做法是为每个用户确定不同的密码加盐(salt)后,再混合用户的真实密码进行md5加密,代码如图4所示。
3.2 SQL注入攻击的防御模型
目前针对SQL注入攻击防御主要是在服务器端进行部署实施,主要包括服务器数据加密、敏感字符的改写、严格区分用户权限等。但也存在一些缺点,第一,服务器端处理数据会造成服务器端压力过大,网络资源损耗。第二,目前编写动态网页程序的语言有很多种,各种程序脚本对应不同的SQL注入方法。
根据上述缺陷,本文提出基于客户端和服务器端两级检查的防御模型。分别在客户端和服务器端进行检查,模型如图5所示。用户在访问网页和进行提交信息时,用户数据发送到服务器端之前,在客户端进行验证,检查是否存在非法输入数据,一旦检查为非法信息,直接过滤掉。不再提交到服务器验证,从而减轻了服务器的验证压力。增强系统的安全性。
服务器接受到提交的数据时,对用户输入数据再次进行验证,没有通过验证的直接禁止访问,直接返回错误页面提示。同时对输入的字符串与系统设计好的规则库进行查询比较。然后再进行权限比对。如果超出权限就直接禁止访问。一旦上述检查都不合法,则形成相应日志,并且发送报告给系统管理员。如果检查都通过,则为合法的访问,允许其通过。
4 结束语
SQL注入攻擊漏洞是网站系统的重大安全隐患,SQL注入攻击对系统数据库的影响非常大,本文就SQL注入攻击的原理进行了阐述,并且对SQL注入攻击进行了实例分析,提出了一套有效的SQL注入攻击防范方法。并且设计了基于客户端和服务器端的SQL注入攻击防御模型,能够有效的抵御SQL注入攻击,具有一定的实用和参考价值。
参考文献:
[1] 王希忠,吴琼,黄俊强,等.SQL注入攻击安全防护技术研究[J].信息技术,2014(9).
[2] 丁允超,范小花.SQL注入攻击原理及其防范措施[J].重庆科技学院学报:自然科学版,2012(5).endprint