博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
参数化查询为什么能够防止SQL注入
阅读量:6548 次
发布时间:2019-06-24

本文共 3971 字,大约阅读时间需要 13 分钟。

参数化查询,防止sql注入漏洞攻击
在这次重构机房收费系统中,有效的解决了SQL注入的问题,这几天对于sql注入攻击进行了详细的研究,在这里做一下回顾。
首先,什么是注入漏洞攻击呢?所谓SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。通常的解决方案有过滤敏感字符,比如说过滤掉or, and , select sql等关键字,通过参数化查询解决sql注入漏洞的实例。
所谓的参数化查询(Parameterized Query 或 Parameterized Statement)是指在设计与数据库链接并访问数据时,在需要填入数值或数据的地方,使用参数 (Parameter) 来给值,这个方法目前已被视为最有效可预防SQL注入攻击 (SQL Injection) 的攻击手法的防御方式。Microsoft SQL Server 的参数格式是以 "@" 字符加上参数名称而成.
例如:SELECT * FROM myTable WHERE myID = @myID INSERT INTO myTable (c1, c2, c3, c4) VALUES (@c1, @c2, @c3, @c4)或者SELECT * FROM myTable WHERE myID = @myID INSERT INTO myTable (c1, c2, c3, c4) VALUES(?,?,?,?),通过(?)指定占位符,当然在添加参数的时候,必须按照(c1, c2, c3, c4)的顺序来添加,否则会出错。
实例:一个简单的登录案例,登录首页
登录代码如下:
 
 分析:
数据表T_User中含有一条数据,userName为admin,Password为123,这样的话输入正确的话能登陆到系统。当用户名输入admin后,在password一栏里输入 1’ or ‘1’=’1 之后按登录按钮,惊奇的发现也能登录成功。
原因输出现在这里: tring cmdText = "select Id  from T_User where userName='"+txtLoginName.Text() +"' and Password='"+txtPwd.Text()+"'"; 这是一句查询语句,采用的是连接字符串的形式。当在sqlserver中输入select * from T_User where userName='admin' and Password ='1' or '1'='1' 这条语句时, sqlserver是正确执行的,也就是返回T_User表中的所有数据。这也就是为什么会发生sql注入漏洞的原因。

      通过注入SQL,这段SQL现在表示的含义是查找(userName='admin'的,且Password='1') 或者1=1 的所有用户,改变了原来自己的初衷,可以看到SQL的语意发生了改变,为什么发生了改变呢?,因为没有重用以前的执行计划,因为对注入后的SQL语句重新进行了编译,因为重新执行了语法解析。所以要保证SQL语义不变,即我想要表达SQL就是我想表达的意思,不是别的注入后的意思,就应该重用执行计划。

如果不能够重用执行计划,那么就有SQL注入的风险,因为SQL的语意有可能会变化,所表达的查询就可能变化。

    所以,入侵者只要知道了你的数据表中的任意一个用户名,就可以登录你的系统,随意更改数据表的资料,造成无法弥补的损失,但是,是不是我们没有什么改变方法呢?
下面就来讨论一下参数化查询,防止sql注入,代码如下:
    在查询语句中加入@user和@pwd这样的参数,然后再为参数赋值,利用这样的形式,即可以防止该漏洞的发生。现在,登录的时候再在Password一栏里输入 1’ or ‘1’=’1 ,就不能够登录了,这样就保证了数据库的安全性。

可以看到参数化查询主要做了这些事情:

1:参数过滤,可以看到 @Password='1' or 1=1—'

2:执行计划重用

因为执行计划被重用,所以可以防止SQL注入。

小结:为参数化查询可以重用执行计划,并且如果重用执行计划的话,SQL所要表达的语义就不会变化,所以就可以防止SQL注入,如果不能重用执行计划,就有可能出现SQL注入,存储过程也是一样的道理,因为可以重用执行计划。

 

转载地址:http://emedo.baihongyu.com/

你可能感兴趣的文章
DATASNAP为支持FIREDAC而增加的远程方法的数据类型TFDJSONDataSets
查看>>
“神一般存在”的印度理工学院到底有多牛?
查看>>
Hadoop2.2.0安装配置手册!完全分布式Hadoop集群搭建过程~(心血之作啊~~)
查看>>
《大话重构》
查看>>
一起谈.NET技术,WPF与混淆器
查看>>
一起谈.NET技术,C#面向对象设计模式纵横谈:Singleton 单件
查看>>
Mozilla公布Firefox 2011年开发计划
查看>>
Java访问类中private属性和方法
查看>>
UIImage扩展方法(Category)支持放大和旋转
查看>>
可复用的WPF或者Silverlight应用程序和组件设计(3)——控件级别
查看>>
Linux 查看进程和删除进程
查看>>
[Shell]Bash基本功能:通配符与特殊符号
查看>>
嵌入式 uboot以及kernel添加看门狗临时记录(个人记录未整理乱)
查看>>
hibernate的一些缺陷(转)
查看>>
An easy to use android color picker library
查看>>
忘记Django登陆账号和密码的处理方法
查看>>
C++的头文件和实现文件分别写什么
查看>>
C语言 · 学生信息(P1102)
查看>>
做项目,还是标准点好(对象命名标准),呵呵
查看>>
iOS开发学习笔记:使用xcode里的单元测试,放在STAssert…里面的语句无法使用自动完成功能...
查看>>