基于SQL注入的Web数据安全防范与优化
作者:林世鑫
来源:《电脑知识与技术》2014年第10
        摘要:SQL注入利用数据库系统的安全漏洞,以及程序中的验证漏洞,构造合适的SQL语句,并通过正常的URL访问进行代码提交,获取数据库中的相关信息,从而实现网站攻击的目的。加强用户提交数据的合法性验证,是防止SQL注入的基本方法。而改善ASP中的Request函数,使其具有对一切用户数据进行合法验证的能力,是SQL注入威胁下,Web数据安全防范方法的最佳优化。
        关键词:SQL注入;数据安全;防范;优化
        中图分类号:TP309.5 文献标识码:A 文章编号:1009-3044201410-2184-04
        Abstract Exploiting the security vulnerabilities of database system and validation vulnerabilities of the computer programs SQL injection builds proper SQL statements submit code by normal URL access and get relevant information from the database in order t
o achieve the goal of website attacks.It is the basic approach of preventing SQL injection to strengthen the legality verification while a user submits data. And under the SQL injection threat it is the best optimization of web data safety precautions to improve the Request function of ASP so as to make it capable to verify the legality of all user data.
        Key words SQL-injection data security precaution optimization
        在当前各类网站建设或者基于Web平台的软件系统建设(以下统称网站)中,由于从事开发的人员的水平与经验,参差不齐,这就直接导致许多网站,都存在着一定程度上的安全隐患,给黑客的攻击留有可趁之机,严重威胁着网站的正常运行。尤其是如果采用SQL注入进行攻击的话,由于该方法灵活多变,对网站的安全性具有更高的考验。并且,这种注入是通过WWW端口实现的,跟对网站的spring framework高危漏洞web页面的正常访问是一样的,因此,这种注入还能绕过许多防火墙的监控,具有很强的隐蔽性。
        各种原因使然,国内目前绝大部分的网站,都采用asp技术,以Access或者SQL-Server为数据库。因此,笔者以此为技术平台,分析SQL注入的安全威胁、防范对策以及深入的优化策略。
        1 SQL注入的基本原理
        所谓SQL注入,是指利用网站程序对用户输入数据的合法性验证中存在的漏洞,构造合适的SQL语句,并通过正常的URL访问提交此代码,从而获取并借肋网站数据库中的相关信息,达到攻击的目的。这种注入随着攻击者的SQL语句构造能力愈强,变化也愈巧妙,对网站的开发者在数据安全防范方面的意识与能力,挑战性也就愈强。
        SQL注入通常有以下四个特征:
        1)利用用户输入数据的合法性验证漏洞进行突破。这与许多黑客攻击直接利用服务器的安全漏洞进行网站攻击有本质的不同。
        2)应变性强。能够根据不同的数据库结构,构造出不同的SQL语句,巧妙灵活;
        3)相关的攻击代码,通过Web端口,伴随着正常的页面访问进行注入,不直接与防火墙或其它安全防范软件进行硬接触
        4Access数据库与Sql-server数据库一个共同的特点:如果参与运算的数据的数据类
型不正确,就先尝试进行数据类型转换,如果转换失败,会返回一个错误报告。SQL注入正是利用这个特点,故意提交一些错误类型的数据,诱惑数据库自觉犯错并报错,从而泄露了重要信息。这一点,也是SQL注入最重要的特征。
        我们举例实际分析一下SQL注入的基本原理。我们设定网站的测试服务器地址为:http//127.0.0.1,测试的URL为:http//127.0.0.1/art_detail.aspid=8
        通过浏览器的地址栏输入以上URL,并在最后加上一个单引号,使其成为http//127.0.0.1/art_detail.aspid=8’,然后再次访问。这时,如果服务器在浏览器中返回以下信息:
        Microsoft JET Database Engine 错误 '80040e14'
        字符串的语法错误 在查询表达式 'ID=8'' 中。
        /art_detail.asp,行9
        那么,根据这个返回的错误信息就可以作出以下判断:
        1)该网站存在SQL注入的安全漏洞,这是最基本的判断;
        2)该网站的数据库是MS-Access,并且连接数据库的引擎是JET
        3)该页面使用的数据表中,有一个字段的名称是ID
        由此可见,如果网站程序对用户的输入信息没有严格的合法性验证的话,仅在一个URL后附加一个简单的符号,就可能试探出许多服务器及数据库中的信息,获取需要的资料。这就是SQL注入的基本原理。
        2 Access数据库的SQL注入与防范对策
        ACCESS数据库尽管存在着各种各样的安全漏洞,但是由于其方便、灵活的性能以及目前国内网站的实际需要,许多网站,依然是采用Access作为数据库。而针对Access数据库,利用SQL注入进行网站攻击的方法,主要有单引号探测法与1=11=2探测法两种。这两种方法基本都是利用了数据库对错误数据类型的数据进行运算时,有自动转换数据类型的特点,因此,在数据安全防范对策上,也主要是从阻止这种自动转换出发。
        2.1 单引号探测法
        无论是哪一种SQL注入方法,寻注入点都是第一点。因此,在防范策略上也主要是从注入点着手,把存在的注入点都消除了,也就意味着堵住了SQL注入的唯一途径。
        在众多的注入点探测法中,单引号探测法是比较基本、简单的一种方法。其操作方法就是在带有访问参数的网址后面,附加一个单引号提交给服务器,再从服务器返回的错误信息中,分析、获取需要的资料,然后决定如何构造进一步的注入语句。它主要利用的漏洞就是程序员在验证用户输入数据时,没有过滤掉特殊字符。因为在带有访问参数的网址中,如http//127.0.0.1/art_detail.aspid=8,当程序收到这串URL时,它必定向数据库进行一个ID=8的查询操作,比如有可能是:
        Dim v_id
        V_id=request.querystring “id”
        Sqlstr=”select * from #table_name where id=”&v_id
        ……
        在大多数情况下,ID字段的数据类型是数字型数值型。如果攻击者在后面附加一个单引号,变成ID=8’,后面的“8’”就不再是数字数值,而是字符串了。在这种情况下,数据库就会尝试把这个字符串型转换成数值型,当然,这样的的转换一定会失败,相关的查询也就没办法完成。于是,服务器便会向客户端的浏览器返回以下信息:
        Microsoft JET Database Engine 错误 '80040e14'
        字符串的语法错误 在查询表达式 'ID=8'' 中。
        /art_detail.asp,行9
        这就是上文所述的情况了。
        当然,对这种情况,我们的防范措施也是比较简单有且有效的。
        第一种方法是对用户端提交来的数据,在程序上先进行数据类型转换,避免直接交给数据库进行转换。如:
        V_id=request.querystring “id”
        改为:
        V_id=Cintrequest.querystring “id”
        这样,如果提交上来的ID值,不是数值型的话,就在执行这个语句时,直接报错,而不再把数据提交给数据库,从而避免由于数据库处理时报错而泄露相关信息。
        第二种方法是采用过滤法,对用户提交上来的数据中,可能存在的特殊字符,先过滤掉,再提交给数据库进行下一步的操作。例如定义一个过滤函数如下:
        <%</p>
        Function ReplaceBadWordg_word
        g_word=Replaceg_word"'"""
        g_word=Replaceg_word" """
        g_word=Replaceg_word"&"""
        g_word=Replaceg_word""""
        g_word=Replaceg_word""""
        g_word=Replaceg_word"/"""
        g_word=Replaceg_word".."""
        g_word=Replaceg_word"^"""
        g_word=Replaceg_word"#"""
        g_word=Replaceg_word"%"""
        g_word=Replaceg_word"|"""
        g_word=Replaceg_word""""

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。