浅谈网站SQL注入攻击防护

时间:2022-06-04 01:10:32

浅谈网站SQL注入攻击防护

摘要:随着信息技术和互联网的发展,网站提供的信息和服务越来越丰富和便利,但是恶意用户对网站的攻击手段也越来越多样和复杂。本文以目前对网站威胁最大的攻击手段:SQL注入攻击为研究对象,对其进行原理分析,并根据攻击原理给出一些具有针对性的防护方法。

关键词:网站安全;SQL注入攻击;SQL注入攻击防护

中图分类号:TP393 文献标识码:A 文章编号:1007-9599 (2012) 13-0000-02

一、引言

随着信息技术和互联网的飞速发展,越来越多的单位和个人通过搭建网站平台向用户提供信息服务,这种方式极大地方便了用户获取各种所需信息。同时,这种方式也吸引了一些恶意用户的关注,在利益的驱动下,恶意用户针对网站的攻击的事件屡屡发生。根据开放式Web应用程序安全项目(OWASP)组织2010年的最新Web应用十大关键风险排名可以看出,对网站安全威胁最大的风险排名第一位的是:注入攻击。而SQL注入攻击是注入攻击中最常见的一种形式,因此网站对于SQL注入攻击的防护也显得尤为重要。

二、SQL注入攻击原理

SQL注入攻击是指恶意用户通过在客户端正常的web表单、域名或页面请求字符串中添加非法的SQL语句或利用SQL语法重新构造SQL语句,并提交给服务器端执行,通过对服务器端返回的结果进行分析,进而获取重要的数据库信息、破坏数据库和控制服务器的攻击方法。

由于SQL注入攻击利用的是合法的SQL语句,使得对服务器的攻击不能被防火墙检测出来,因而这种攻击具有难以发现,难以识别的特性。从应用层面来说,只要是基于SQL语言标准的数据库都可能是潜在的被攻击对象,因此危害性很大。

那么SQL注入攻击到底是怎样工作的呢?我们这里以在ASP+SQL SERVER平台上最常见的用户登录功能来做一个演示。一般情况下,登录窗口都会要求我们输入用户名和密码,然后提交给数据库查询用户是不是存在。在数据库端的正常查询语句为:

SELECT * FROM 用户表 WHERE 用户名 = ''user'' AND 密码 = ''password''

程序员在用ASP实现的时候,一定是用连接字符串然后再加上SQL命令,最后执行查看返回的结果是否为空。那么SQL语句嵌套在ASP代码中的形式就像这样:

var sql = "SELECT * FROM 用户表 WHERE 用户名 = ''" + loginname + "'' AND 密码 = ''" +loginpwd + "''";(其中loginname与loginpwd分别存储了前台文本框传递到后台的用户输入的用户名和密码。)

但是当用户在前台输入的内容为:loginname='' or 1=1 – – ,loginpwd的内容任意输入时。则在ASP中的查询语句将变为:

SELECT * FROM 用户表 WHERE 用户名= '' '' or 1=1 – – AND 密码 = ''任意输入内容''

这样使得密码验证被注释掉了,而用户名验证则被“1=1”这个恒等式所取代。用户名和密码的验证成为了摆设,恶意用户则可以很顺利的登录网站。

上例只是SQL注入攻击的一种最简单形式。对于存在着SQL注入攻击漏洞的网站,攻击者还可以通过专用工具或手工构造特殊代码不断的猜测尝试,从而获得数据库名称,表名,表中的字段名,甚至是具有系统管理权限的用户帐号和密码、上传病毒、木马或恶意文件,给网站带来巨大危害。

三、SQL注入攻击的防范

SQL注入漏洞的产生通常是由于程序员对注入攻击手段不了解,数据验证和过滤不严格,服务器设置不完善导致的。因此对SQL注入攻击的防范也应当从这几个方面来入手。

(一)对数据库查询改动态查询为参数化查询

参数化查询是指连接数据库查询时,在需要填入数值或数据的地方不是直接赋值,而是使用参数来给值。

我们前面所举的SQL注入攻击的例子就是使用动态查询所引发的。但是在使用参数化查询的情况下,数据库服务器不会将参数的内容作为SQL查询语句的一部份来处理,而是在数据库完成SQL语句的编译后,才套用参数的内容来运行。因此就算参数中含有非法的SQL语句,数据库也不回去执行。因此参数化查询目前被视为防范SQL注入攻击的最有效的方法。

(二)对用户提交的数据进行验证和过滤

SQL注入攻击主要是通过在用户提交的数据中嵌入非法的SQL语句来实现,所以对用户提交的数据进行验证和过滤能够有效的防范SQL攻击的出现。其方法是在程序中对用户提交的数据进行检测,如果检测出含有与SQL相关的敏感字符或字符串(如:’、、=、select、delete、drop等)时,就认为存在SQL注入攻击行为。程序则可以通过阻止SQL语句的执行;将出现的敏感字符或字符串进行转义替换或者将页面跳转到出错提示页面来使非法SQL语句失效,从而起到防范攻击的作用。

(三)对网页间传递的查询字符串进行加密处理

网页间传递的查询字符串是SQL注入攻击的一个重点目标。但是只要对查询字符串进行加密,则恶意用户就很难判断加密所用的算法和密钥,因此也很难构造出其需要的SQL代码。现在通常是用MD5算法对网页间的查询字符串进行加密。MD5加密是单向的,而且密钥可以自己设定,使得恶意用户很难破解查询字符串的内容,要向查询字符串中嵌入SQL代码更是不可能的事情。

(四)对程序出错信息进行屏蔽

恶意用户通常是通过WEB服务返回的错误信息来探知是否存在SQL注入漏洞、以及数据库的类型和连接方式等。如果屏蔽了程序的错误信息,就能够阻止恶意用户获取与数据库相关的有价值的信息,使其不能够确定下一步攻击的目标,从而确保了数据库数据的相对安全。

(五)对数据库中的重要数据进行加密

恶意用户所有的攻击行为都是为了窃取数据库中的重要数据。因此对这些重要数据进行加密后,即使恶意用户通过非常规的手段攻破了网站的防护,得到的也只是加密过后的数据,无法直接解密,使得被攻击的损失减少到最小。

四、结束语

SQL注入攻击对现有的WEB网站安全是一个重大的威胁。恶意用户只需要较少的相关知识就能够轻而易举的发起攻击;而且现在还有很多专门针对于SQL注入漏洞的自动检测和攻击工具,使得发起攻击的门槛进一步降低。因此,网站设计人员一定要对SQL注入攻击投以足够的重视,深刻了解相关的原理,全面做好网站的安全防护,将网站发生SQL注入攻击的可能性降到最低。

参考文献:

[1]OWASP.OWASP Top 10-2010[R],2010,4

[2]王志虎.SQL注入攻击及其预防方法研究[J].煤炭技术,2011,1

上一篇:基于XML的校园异构系统的数据交换安全研究 下一篇:医院与医保联网存在的安全风险和解决方案