防止sql注入的参数化查询
参数化查询为什么能够防止SQL注入
http://netsecurity.51cto.com/art/201301/377209.htm
OleDbDataAdapter Class
http://msdn.microsoft.com/en-us/library/system.data.oledb.oledbdataadapter.aspx
Sql Server 编译、重编译与执行计划重用原理
http://www.2cto.com/database/201301/183262.html
SQL语句很强大,很多时候需要拼凑SQL语句来完成某些功能,比如执行查询时候
SELECT * FROM Customers where CustomerID like '%inputCustomerId%' or CompanyName like '%inputCompanyName%'
假如有意使用途中字符串,会导致所有表中记录都能查询出来,为了避免这样的情况,需要使用参数化查询
1.首先想到使用store procedure
Dim objCommand As OleDb.OleDbCommand
objCommand = New OleDb.OleDbCommand
With objCommand
.CommandText = "Test_StoreProcedure"
.Connection = connDbConnection
.CommandType = CommandType.StoredProcedure
.Parameters.AddWithValue("@CustomerId", customerId)
.Parameters.AddWithValue("@CompanyName", companyName)
.Parameters.AddWithValue("@ContactName", contactName)
End With Dim ds As DataSet
Dim objAdaptor As OleDb.OleDbDataAdapter
objAdaptor = New OleDb.OleDbDataAdapter
ds = New DataSet
objCommand.Connection = connDbConnection
objAdaptor.SelectCommand = objCommand
objAdaptor.Fill(ds)
可是在store procedure 内部,依然需要拼凑出sql语句来返回结果,等于什么作用都没起 2.利用DataView
Dim dv As DataView = New DataView(dt)
dv.FindRows("customerid like '%" + customerId + "'%")
可以看到这种方式仍然是拼凑条件字符串,不会起作用 3.利用CommandType.Text的OleDbCommand不需要结果集可以用objCommand.ExecuteNonQuery()
Dim objCommand As OleDb.OleDbCommand
objCommand = New OleDb.OleDbCommand
With objCommand
.CommandText = "select * from customer where customerid like ? or companyname like ? or contactname like ?"
.Connection = connDbConnection .CommandType = CommandType.Text
.Parameters.AddWithValue("@CustomerId", customerId)
.Parameters.AddWithValue("@CompanyName", companyName)
.Parameters.AddWithValue("@ContactName", contactName)
End With Dim ds As DataSet
Dim objAdaptor As OleDb.OleDbDataAdapter
objAdaptor = New OleDb.OleDbDataAdapter
ds = New DataSet
objCommand.Connection = connDbConnection
objAdaptor.SelectCommand = objCommand
objAdaptor.Fill(ds) 4.直接利用OleDbDataAdapter的SelectCommand.Parameters,返回dataset
Dim sql As String = "select * from customer where customerid like ? or companyname like ? or contactname like ?"
Dim objAdaptor As OleDb.OleDbDataAdapter = New OleDb.OleDbDataAdapter(sql, connDb)objAdaptor.SelectCommand.Parameters.AddWithValue("@CustomerId", "%" + customerId + "%")
objAdaptor.SelectCommand.Parameters.AddWithValue("@CompanyName", "%" + companyName + "%")
objAdaptor.SelectCommand.Parameters.AddWithValue("@ContactName", "%" + contactName + "%")
objAdaptor.Fill(ds) 在数据库端看到的执行语句会包含有参数的类型,如下
exec sp_executesql N'select * from customer where customerid LIKE @P1 and companyname LIKE @P2 and inputDate >= @P3 ',N'@P1 nvarchar(2),@P2 nvarchar(2),@P3 datetime',N'%%',N'%%','1900-01-02 00:00:00' 5.利用System.Data.Linq
DataContext db = new DataContext();
IQueryable<Customer> custs = db.Customers;
custs = custs.Where(o=>o.CustomerId.Contains(customerId));custs = custs.Where(o=>o.CompanyName.Contains(companyName));custs = custs.Where(o=>o.ContactName.Contains(contactName0);
如果传进去的customerId包含like等语句,则这个linq语句不能成功解析出对应的sql语句,会报错 6.很多时候数据库太复杂,需要用到各种数据库函数的时候,我们既想要利用sql语句来拼装,又不愿意冒着参数注入的危险,可以先用IQueryable<>或者IEnumerable<>来得到结果后再用where进行过滤
IEnumerable<Customer> custs = db.ExecuteQuery<Customer>("select top 5 * from customer");
custs = custs.Where(o=>o.CustomerId.Contains(customerId));
防止sql注入的参数化查询的更多相关文章
- SQL注入与参数化查询
SQL注入的本质 SQL注入的实质就是通过SQL拼接字符串追加命令,导致SQL的语义发生了变化.为什么发生了改变呢? 因为没有重用以前的执行计划,而是对注入后的SQL语句重新编译,然后重新执行了语法解 ...
- 多条件搜索问题 -sql拼接与参数化查询
来源:传智播客 免费开发视频. 问题:根据书名或出版社或作者查询书籍信息. using System; using System.Collections.Generic问题; using Syste ...
- 利用DNS实现SQL注入带外查询(OOB)
根据用于数据检索的传输信道,SQLi可分为三个独立的类别:inference(经典SQL注入),inband(盲注.推理注入.带内注入)和out-of-band 一.什么是OOB out-of-ban ...
- Sql Server 的参数化查询
为什么要使用参数化查询呢?参数化查询写起来看起来都麻烦,还不如用拼接sql语句来的方便快捷.当然,拼接sql语句执行查询虽然看起来方便简洁,其实不然.远没有参数化查询来的安全和快捷. 今天刚好了解了一 ...
- SQL注入:基本查询原理
SQL注入概述 sql注入不需要精通sql的各种命令,只需要了解几个命令并会使用即可. SQL注入:一种针对于数据库的攻击 现在的web网站都需要数据库的支持. SQL部分重要内容: 库:databa ...
- python之MySQL学习——防止SQL注入(参数化处理)
import pymysql as ps # 打开数据库连接 db = ps.connect(host=', database='test', charset='utf8') # 创建一个游标对象 c ...
- 从sp_executesql中返回table型数据及动态SQL语句的参数化查询
在返回分页数据时,我们会经常会用到参数化传递过滤条件,如何拼接SQL语句成了一个难题. 我们可以这样拼接: exec('sp_executesql sql语句,参数定义,参数值') sql语句和参数定 ...
- sql注入之双查询注入
双查询注入前需要了解什么是子查询 子查询可以理解在一个select语句中再插入一个select 里面的select语句就是子查询 例子:select concat((select database() ...
- 对于SQL注入的理解
从网上搜索的资料,结合自己的理解整理了一下,网友们在查看时若有发现问题,还请不吝指正,谢谢! 1.什么是SQL注入? ——官方说法:把SQL命令插入到web表单验证的输入框中,提交到服务器,以达到越过 ...
随机推荐
- Thinkphp自定义生成缩略图尺寸的方法
Thinkphp自定义生成缩略图尺寸的方法,本实例中生成两张不同尺寸的图片:第一张是大图350*350,第二张 50*50的缩略图 Image类是Thinkphp系统自带的,可以研究下,这个缩略图类很 ...
- PHP搭建B2C分销商城系统需要考虑哪些因素?(一)
在网购日渐繁盛的今天,传统线下门店和代理分销越发显示出其弊端.此种情况下,进入互联网市场是最好的选择.入驻第三方平台成本太高,无法掌握自己的流量,所以搭建自己的分销平台成为众多企业的首选.搭建B2C分 ...
- golang数据类型
整数类型 Golang各整数类型分:有符号和无符号,int uint 的大小和系统有关. Golang查看一个变量的数据类型: package main import "fmt" ...
- Statefulset的拓扑状态
Statefulset: 实例之间有不对等关系,以及实例对外部数据有依赖关系的应用,就被称为“有状态应用”(Stateful Application). StatefulSet 的设计其实非常容易理解 ...
- docker 入门5 - 栈 【翻译】
入门,第 5 部分:堆栈 先决条件 安装 Docker 版本 1.13 或更高版本. 获取第 3 部分先决条件中所述的 Docker Compose. 获取 Docker Machine,如第 4 部 ...
- Java浅拷贝与深拷贝(思维导图)
图1 拷贝思维导图(点击查看图片) 1,拷贝 有两个相同属性的对象A和B,A拥有初始化值,将其值拷贝到B中,使得B拥有与A“相同”数据的属性!注意这里的相同我有加双引号! 相同可能表示这么几个意思:① ...
- where用法
where 子句用于指定类型约束. 1.接口约束 public class MyGenericClass<T> where T:IComparable { } 2.基类约束: 指出某个类 ...
- go module 设置
国内无法获取被墙的go module,解决方法,设置环境变量 GO111MODULE=on goproxy=https://goproxy.io
- 10.Spring整合Hibernate_3_HibernateTemplate
将sessionFactory 注入给 hibernateTemplate,让hibernateTemplate帮我们完成一些模板代码 <!-- 使用HibernateTemplate --&g ...
- Notepad++快捷键及使用技巧
常用快捷键: CTRL+Q 注释/取消注释 用Notepad++写代码,要是有一些重复的代码想copy一下,还真不容易,又得动用鼠标,巨烦人....有木有简单的方法呢,确实还是有的不过也不算太好用.主 ...