从软件开发角度谈SQL注入

来源 :计算机光盘软件与应用 | 被引量 : 0次 | 上传用户:ycy111
下载到本地 , 更方便阅读
声明 : 本文档内容版权归属内容提供方 , 如果您对本文有版权争议 , 可与客服联系进行内容授权或下架
论文部分内容阅读
  摘 要:从软件开发角度谈了SQL注入,对SQL注入攻击的原理及危害进行了介绍,从软件开发的角度分析防范SQL注入攻击的方法,特别是参数化查询。
  关键词:SQL注入;参数化查询;Web安全
  中图分类号:TP393.08
  2011年12月,CSDN网站数据库遭黑客入侵,640万用户注册邮箱和密码被泄露,大规模转载于网络,后事件持续发酵,中国互联网有史以来波及面最广、规模最大、危害最深的泄密事件全面爆发。从报道中提供的账号密码截图和已经获得的数据库密码表来看,可以断定是网站存在SQL注入漏洞。尽管使用明文存储密码造成事件危害巨大,但是CSDN泄密事件的根源还在于SQL注入漏洞。
  SQL注入是最常见的两种Web应用程序威胁之一,影响广泛、危害严重,虽已出现多年,但依然广泛存在。目前作者参与的课题也主要采用B/S架构,Web安全性也是需要考虑的。因此本文主要基于Asp.Net,探讨了SQL注入的原理、危害和防范措施,特别是防范措施中的参数化查询的方法。
  1 SQL注入的原理及危害
  SQL注入(SQL injection),是发生于应用程序之数据库层的安全漏洞。就是在输入的字符串之中注入SQL指令,由于在设计不良的程序当中忽略了检查,那么这些注入进去的指令就会被数据库服务器误认为是正常的SQL指令而运行,因此而带来的危害[1]。
  1.1 原理
  SQL语句中
  (1)以分号作为不同语句的区别。
  (2)传入的字符串参数用单引号字符包住。
  (3)可以包含注释(连续2个减号字符 – 后的文字为注解,或“/*”与“*/”所包起来的文字为注解)。
  因此,攻击者有可能在组合SQL的命令字符串时,将字符变量中填入命令字符串,从而恶意篡改原本的SQL语法的作用。
  例如:某个网站的登录验证的SQL查询代码为
  strSQL = “SELECT * FROM users WHERE (name =‘” + name + “’) and (pw = ‘”+ password +”’);”
  惡意填入:
  name = “’ OR ‘1’=’1”;
  password = “’ OR ‘1’=’1”;
  从而使原本的SQL字符串被变成了
  strSQL = “SELECT * FROM users WHERE (name = ‘’ OR ‘1’=’1’) and (pw = ‘’ OR ‘1’=’1’);”
  也就是说实际上运行的SQL命令是这样的:
  strSQL = “SELECT * FROM users;”
  因此此账号无密码,亦可登录网站。
  通常对于攻击者来说,网站所使用的SQL代码(如上文中的strSQL)是不能直接得到的,需要攻击者通过不停的尝试,通过提交构造巧妙的字符串,来达到执行非网站设计者所期望的SQL语句,比如提供用户的输入框、Cookie、URL等。所以SQL注入攻击被俗称为黑客的填空游戏。
  1.2 可能造成的危害
  (1)数据被窃,例如个人信息,账户密码,机密信息等。
  (2)数据结构被探知,这个还得以做进一步攻击(比如SELECT * FROM sys.tables)。
  (3)数据库服务器被攻击,导致系统管理员账户被窜改。
  (4)系统被攻击,取得系统较高权限后,有可能得以在网页加入恶意链接以及跨站脚本攻击(XSS)。
  (5)操作系统被控制,经由数据库服务器提供的操作系统支持,让黑客得以修改或控制操作系统。
  (6)硬盘数据被破坏,瘫痪全系统。
  2 防范措施
  防范SQL注入,本质上就是要正确区分出哪些是真正的SQL代码,以避免执行恶意植入的代码。
  2.1 在服务器端验证用户输入的合法性
  针对SQL注入攻击的手段,可以判断就是通过篡改用户的关键信息,因此为避免或者防范注入攻击,就必须对特殊的字符进行有效过滤或转换(例如:单引号、连接号、双引号、分号、逗号、冒号等等)。同时对用户输入字符串长度进行有效的限制。
  比如在上面的那个例子中,通常用户名都应该是有一定的长度限制,只能包含数字、字母、下划线。如果用我们发现用户名不是合法输入,则拒绝传递给SQL语句。
  2.2 制定合理有效的错误返回策略
  由于SQL的错误反馈信息可以有效的透露数据库设计的某些细节,通常情况下正确而有效的做法就是对发生错误的页面进行一定的包装,根据用户的权限来向用户展示错误的信息,如果没有管理员的权限,可以仅仅提示是SQL发生了错误的运行,尽量不要将错误的信息全部反馈给用户。
  现在大部分web服务器(例如IIS)已经提供了这种功能,只有在服务器上才提供出错调试信息,在远程访问时不包含任何调试信息[2]。
  2.3 严格控制数据库用户权限
  数据库用户的权限配置应采用最小权限原则。如连接到数据库的用户只给访问数据库的最低权限;对于不需要进行操作的表,只保留表的只读权限;对于不需要访问的表,则连访问权限也去掉;为不同类型的操作使用不同级别的用户权限。总之,开发人员应该合理分析用户需求,针对不同的用户设置不同的权限,保证系统处于稳定安全状态。
  严格的数据库用户权限管理可以有效降低数据库层安全问题可能造成的危害。
  2.4 完全使用参数化查询而不是字符串拼接的方式访问数据库
  2.4.1 参数化查询
  目前最有效可预防SQL注入攻击的防御方式是参数化查询,是指在设计与数据库链接并访问数据时,在需要填入数值或数据的地方,使用参数来给值。   在使用参数化查询的情况下,数据库完成SQL指令的编译后,才套用参数运行,不再将参数的内容视为SQL指令的一部份来处理,因此就算参数中含有具破坏性的指令,也不会被数据库所运行。
  相比于拼接字符串的SQL语句,参数化查询会带来一些额外的开发成本,特别是针对已经完成的项目进行修改时,但参数化查询对于预防SQL注入是非常高效的。
  2.4.2 参数化查询的撰写
  Microsoft SQL Server的参数格式是以“@”字符加上参数名称而成,支持匿名参数“?”。
  Microsoft Access 不支持具名参数,只支持匿名参数“?”。
  MySQL的参数格式是以“?”字符加上参数名称而成。
  PostgreSQL和SQLite的参数格式是以“:”加上参数名而成。支持匿名参数。
  在ADO.NET客户端代码中撰写使用参数化查询的代码,例如:
  SqlCommand sqlcmd = new SqlCommand(“INSERT INTO myTable (c1,c2)VALUES(@c1,@c2)”,sqlconn);
  sqlcmd.Parameters.AddWithValue(“@c1”,1);//设定参数@c1的值。
  sqlcmd.Parameters.AddWithValue(“@c2”,2);//设定参数@c2的值。
  sqlconn.Open();
  sqlcmd.ExecuteNonQuery();
  sqlconn.Close();
  上面的代码并不是特别恰当地写法,在后文有说明。
  2.4.3 性能优势和需要注意的问题
  除了安全因素,相比起拼接字符串的SQL语句,参数化的查询往往有性能优势。因为参数化的查询能让不同的数据通过参数到达数据库,从而公用同一条SQL语句。大多数数据库会缓存解释SQL语句产生的字节码而省下重复解析的开销。如果采取拼接字符串的SQL语句,则会由于操作数据是SQL语句的一部分而非参数的一部分,而反复大量解释SQL语句产生不必要的开销。
  需要注意的是,不恰当地使用ADO.NET的参数化查询方法在某些情况下(数据量大,结果集也大等)反而会表现出较为明显的效率损失。在编写参数化查询代码过程中,很多开发者指定查询参数的类型没有明确,这导致了托管代码在执行过程中不能自动识别参数类型,进而对该字段内容进行全表扫描以确定参数类型并进行转换,消耗了不必要的查询性能所致。错误的参数化查询方法带来的另一点伤害是导致表索引失效,一切本应是索引扫描的操作均由表扫描替代[3]。
  参数化查询参数类型为值类型(int,decimal,datetime等)则仅为指定参数类型(指定参数长度也没用),若为可变长度时(varchar,nvarchar,char等)请指定参数类型及长度
  sqlcmd.Parameters.Add(new SqlParameter("@UserName", SqlDbType.VarChar,50) { Value = "username1" });
  3 结束语
  B/S架构以其开发成本低、管理方便、跨平台的优势得以迅速发展,同时Asp.Net使得开发效率大幅提升、开发门槛大幅降低。网站开发者必须养成良好的编程习惯,对常见的威胁网站安全的手段有所了解,避免安全漏洞的产生。SQL注入攻击成功后,对服务器乃至系统都是巨大的威胁。因此,研究SQL注入攻击的防范方法、加强代码编写时对用户输入信息的过滤检查,对于开发安全的Web应用程序有着重要意义。
  参考文献:
  [1]维基百科,http://zh.wikipedia.org/zh-cn.
  [2]李元鹏.SQL注入攻击扫描分析工具的实现与攻击防范技术研究[D].北京交通大學,2010.
  [3]ADO.NET中应用大数据量参数化查询的效率分析,http://www.cnblogs.com/hysoka/articles/2295206.html.
  作者单位:63888部队,河南济源 454650
其他文献
针对空调系统的二次污染问题,制作壳聚糖复合滤料,以白色葡萄球菌为目标微生物,在风道式净化系统中进行除菌实验,分析基材、滤速、壳聚糖质量分数及滤料厚度等因素对除菌效率
以往的犯罪论体系研究,是一种脱离犯罪论体系与刑法学其他重要范畴的关系而进行的孤立研究。犯罪论体系研究应是在照应其与刑法典的关系中进行。犯罪论体系是刑法典相关内容
本文阐述了基于VFP技术的网页数据采集系统,针对高校数字化资源建设的需求现状,提出解决方案,介绍了一个基于VFP技术的网页数据采集爬虫的一种工作流程和爬行算法,从链接和网
平面钢管桁架的整体稳定性主要由其受压弦杆的平面外稳定性决定.本文针对上弦简支、承受均布荷载的平面钢管桁架,采用势能原理确定了考虑受压弦杆不均匀轴力影响的计算长度系
针对常规RBF神经网络训练速度慢、控制精度不高的问题,文章提出一种基于自适应遗传优化的RBF神经网络方法,并把优化后的方法用于PID控制器的参数整定中。仿真实验表明,改进后的
在清代,庙会文化是民间神灵信仰与地方文化相互杂糅的产物,是窥探民间社会的主要视角之一。鄱阳县张王庙会是古代鄱阳民间百姓的精神世界与信仰空间,张王庙会繁荣鄱阳县商贸
本研究分析了高职英语教学中的现状,确定了高职英语教学培养学生创新能力的重要性,探讨了在教学中培养学生创新能力的思路与策略。
传统事业单位资产管理办法已跟不上时代的步伐,人工存档管理逐渐被信息化取代。事业单位需要建立一套切实可行的资产管理办法,以保证企业长期有效发展。从信息化管理角度对小
纯洁性是马克思主义政党本质特征的必然要求。中国共产党自创建以来,无论是在革命、建设时期,还是在改革开放时期,都一直高度重视保持党的纯洁性。新形势下,我们党要经受住"四
针对彩色图像中显著目标检测,提出联合多尺度小波变换和超复数分数阶相位(Multi-scale Wavelet and Phase of Quaternion Fractional Fourier Transform,MWPQFrT)的显著目标检测算法。结合人眼的视觉特性、多尺度小波变换的高分辨率特性、分频特性和超复数分数阶傅里叶变换的相位谱信息,在没有任何先验知识的条件下,能准确检测出彩色图像中的