您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > 防范SQL注入方法汇总2
一.防范SQL注入方法汇总Web开发人员认为SQL查询请求是可以信赖的操作,但事实却是恰恰相反的,他们没有考虑到用户可以控制这些查询请求的参数,并且可以在其中输入符合语法的SQL命令。解决SQL注入问题的方法再次归于对特殊字符的过滤,包括URL、表格域以及用户可以控制的任何输入数据。与SQL语法相关的特殊字符以及保留字应当在查询请求提交到数据库之前进行过滤或者被去除(例如跟在反斜号后面的单引号)。过滤操作最好在服务器端进行。将过滤操作的代码插入到客户机端执行的HTML中,实在是不明智的,因为攻击者可以修改验证程序。防止破坏的唯一途径就是在服务器端执行过滤操作。避免这种攻击更加可靠的方式就是使用存储过程。具体可以通过以下若干方法来防范SQL注入攻击。(1)对前台传入参数按的数据类型,进行严格匹配(如查看描述数据类型的变量字符串中,是否存在字母)。(2)对于单一变量(如上面的K,N)如果有必要,过滤或替换掉输入数据中的空格。(3)将一个单引号(“'”),替换成两个连续的单引号(“''”)。(4)限制输入数据的有效字符种类,排除对数据库操作有特殊意义的字符(如“--”)。(5)限制表单或查询字符串输入的长度。(6)用存储过程来执行所有的查询。(7)检查提取数据的查询所返回的记录数量。如果程序只要求返回一个记录,但实际返回的记录却超过一行,那就当作出错处理。(8)将用户登录名称、密码等数据加密保存。加密用户输入的数据,然后再将它与数据库中保存的数据比较,这相当于对用户输入的数据进行了“消毒”处理,用户输入的数据不再对数据库有任何特殊的意义,从而也就防止了攻击者注入SQL命令。总而言之,就是要尽可能地限制用户可以存取的数据总数。另外,对用户要按“最小特权”安全原则分配权限,即使发生了SQL注入攻击,结果也被限制在那些可以被正常访问到的数据中。二.合法性校验1.客户端进行合法性校验我们在制作网站的时候,尤其是各种电子商务网站,首先都会让用户填写一些表格来获取注册用户的各种信息,因为用户有可能输入各式各样的信息,而有些不符合要求的数据会给服务器后台处理程序带来不必要的麻烦,甚至导致网站出现一些安全问题。因此我们在将这些信息保存到网站的数据库之前,要对这些用户所输入的信息进行数据合法性校验,以便服务器后台程序可以安全顺利地执行。通过运行在客户端的的JavaScript或其它脚本可以检验用户的输入数据。在JavaScript中,利用form.textfield.value得到form表单的textfield文本框中输入的数据,然后通过RegExp对象(保存有关正则表达式模式匹配信息的固有全局对象)的test方法进行正则表达式模式匹配,通过匹配结果决定用户的后续操作。三.预编译SQL查询1.preparedstatementpreparedstatement可以在执行具体的SQL查询前进行SQL预编译,这样在以后执行相同的SQL查询时,只需传入不同的参数,便可重复执行,而不用每次执行相同的SQL查询时都让服务器耗费时间进行编译。下面是一个preparedstatement的范例。其中符号“?”叫做占位符(placeholder),执行SQL时,必须传入参数,取代占位符,才能真正执行SQL查询。在SQL查询中使用preparedstatement可以增进安全性及效率。(1)preparedstatement把SQL的逻辑语句与传入的参数相分离,可以增加安全性,这样的做法,可以避免SQL注入攻击。如果使用一般的SQL查询,没有分离SQL逻辑与传入参数,就必须非常小心处理用户输入的数据,通常会使用一些特定的函数,限制单引号、双引号、斜杠等特征字符。但是当使用preparedstatement时,根本不用使用特殊的函数来避免SQL注入的攻击,你可以直接使用preparedstatement,而不会造成任何SQL注入漏洞。(2)效率的提升来自preparedstatement的一些特殊之处,首先preparedstatement中的SQL查询只要预编译一次,之后执行的SQL查询就不用再做这些编译动作,如果要执行相同的SQL查询很多次,就可以增加执行的速度。另外,preparedstatement使用了binaryprotocol,传统的mysql会将传入参数转换成字符串,再进行传入,但使用binaryprotocol后,不会进行参数的转换,而是直接将参数以原有的binary形式进行传入,降低了cpu的负荷,也减少了网络的占用率(转换成字符串,参数量会变大)。2.MySQLstatementAPIMySQL在4.1及以上版本中提供了preparedstatement功能,通过调用statementAPI接口函数可以实现preparedstatement。MySQL由mysql.stmt.Statement对象提供preparedstatement功能。3.PHP5支持preparedstatementPHP5的mysqli扩展(ImprovedMySQLExtension)支持preparedstatement。它能够访问基于MySQL4.1及以下版本提供的特性。本练习单人为一组。首先使用“快照X”恢复Linux系统环境。一.客户端进行合法性校验进行实验之前首先启动MySQL服务,命令如下:(1)单击工具栏“控制台”按钮,进入实验目录。login是存在SQL注入漏洞的Web应用程序。复制login.htm和login.php文件到/var/目录(Web服务文档主目录)。(2)使用Web浏览器浏览login.htm,在URL地址栏中输入如下信息:进入“注册会员登录”页面,用户名:hello,密码:hellopass,确定登录成功。(3)注入攻击返回login.htm登录界面,输入用户名:hello'or'1=1,密码任意,尝试登录。由于login.htm没有对“用户名”、“密码”输入数据的合法性进行验证,从而导致了SQL被注入。(4)编辑/var/文件,利用JavaScript对用户输入数据进行合法性验证,限制用户输入“'”(单引号)、、“”(双引号)、“-”、“=”、“;”、“”、“”、“/”、“%”特殊字符及SQL关键字。(5)加入合法性校验后,尝试基于login.htm进行SQL注入攻击。(6)加入合法性校验后,尝试基于URL进行SQL注入攻击。直接在URL链接中输入http://虚拟主机地址/login.php?username=hello’or’1=1。结果:依然注入成功。二.服务器进行合法性校验(1)复制并重命名实验目录login.htm和login.php文件至/var/和login2.php。(2)编辑/var/文件,利用PHP脚本对用户输入数据进行合法性验证,限制用户输入“'”(单引号)、“”(双引号)、“-”、“=”、“;”、“”、“”、“/”、“%”特殊字符及SQL关键字。(3)加入合法性校验后,尝试基于login.htm进行SQL注入攻击。(4)加入合法性校验后,尝试基于URL进行SQL注入攻击。直接在URL链接中输入http://虚拟主机地址/login.php?username=hello’or’1=1。结果:失败。三.预处理执行SQL查询(1)复制并重命名实验目录login.htm和login.php文件至/var/和login3.php。(2)编辑/var/文件,重写PHP访问MySQL数据库部分,利用preparedstatement实现SQL查询。「说明」关于PHP5mysqli扩展(ImprovedMySQLExtension)参见应用服务器PHP手册(http://应用服务器IP/php/mysqli/index.html)。需要实验人员从手册中挖掘信息,理解API使用方法,编写代码。(3)尝试进行各种SQL注入攻击。
本文标题:防范SQL注入方法汇总2
链接地址:https://www.777doc.com/doc-1982126 .html