【背景】
前一段时间在学牛腩,在机房重构中的知识现在又复习了一遍,我们对知识的掌握不能急于求成,需要一点一点地来,第一遍的学习想要全部学会是不可能的,都说一口不能吃个胖子,一遍一遍的重复,一遍有一遍的理解,这次比上次知道的多一点,知识就是在这样的情况下慢慢积累起来的,下面来总结一下这次对于SQL注入的学习。
【什么是SQL注入?】
百度百科的答案:通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。具体来说,它是利用现有应用程序,将(恶意)的SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。
我的理解:有一定数据库知识的人利用有安全漏洞的网站的数据库通过在Web界面上输入有恶意作用的SQL命令,而跳转到应用程序的后台试图获取数据库的信息而进行非法的操作(增删或修改数据库信息)影响应用程序的正常使用,背离数据库设计者的意图。
【举例说明】
实现功能:
增加一个新闻类别,需要执行一条插入新闻类别语句,向数据库的新闻类别(category)表中插入一条记录。
代码展示(部分):
前台输入:
执行效果:
如果D层语句使用拼接字符串(红框内),界面上显示添加成功,但是后台数据库中在添加一条“”娱乐新闻”的新闻类别记录的同时,还悄悄地将id为5的那条记录删除了!!!如果使用参数化查询(蓝框内),一切正常,输入的删除语句是无效的!
原因解读:
界面输入是这样的:娱乐新闻’)delete category where id=5—
完整SQL插入语句是这样的:insert into category (name)values('娱乐新闻')delete categorywhere id=5--')
--表示注释,上面的语句表示后面的’)部分表示注释掉了,所以执行后既有插入又有删除。
【如何避免SQL注入?】
1.插入的时候不能使用构造的sql语句,应该使用带参数的SQL语句,参数化查询是指在设计与数据库链接并访问数据时,在需要填入数值或数据的地方,使用参数 (Parameter) 来赋值, SQL Server 的参数格式是以 "@" 字符加上参数名称而成的。这样输入语句中的删除字段就不起作用了,含有恶意的查询语句都不会插入数据库了——牛腩老师;
2.永远不要信任用户的输入。对用户的输入进行校验,可以通过正则表达式,或限制长度;对单引号和双"-"进行转换等。
3.永远不要使用动态拼装sql,可以使用参数化的sql或者直接使用存储过程进行数据查询存取。
4.永远不要使用管理员权限的数据库连接,为每个应用使用单独的权限有限的数据库连接。
5.不要把机密信息直接存放,加密或者hash掉密码和敏感的信息。
6.应用的异常信息应该给出尽可能少的提示,最好使用自定义的错误信息对原始错误信息进行包装
7.sql注入的检测方法一般采取辅助软件或网站平台来检测,软件一般采用sql注入检测工具jsky,网站平台就有亿思网站安全平台检测工具。MDCSOFT SCAN等。采用MDCSOFT-IPS可以有效的防御SQL注入,XSS攻击等。
【总结】
用一个大圆圈所学到的知识,但是圆圈之外是那么多的空白,对我来说就意味着无知。由此可见,我感到不懂的地方还大得很呢。———— 爱因斯坦