防止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表单验证的输入框中,提交到服务器,以达到越过 ...
随机推荐
- Laravel入门
一.下载Laravel ①github上下载 ②通过composer下载,推荐 第一步,选择你要在哪个目录下载Laravel,打开cmd 第二步,打开https://docs.golaravel.co ...
- linux 对外开放端口
查看守护进程端口 netstat -ntpl 查看开放的端口 iptables -nvL 查看端口是否可访问:telnet ip 端口号 (如本机的35465:telnet localhost 354 ...
- 微信小程序的wxs语法与vue计算属性
微信小程序的wxs语法 可以当做vue的计算属性和vue filter 使用.因为wxs中的函数可以写在{{ }}中 . 例如: 可用在 <view>{{ foo() }}</v ...
- 在windows部署service
首先,需要在环境变量的path中加入Install Util的路径: C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727 注意这里的Framework\v2.0 ...
- 使ffmpeg支持HDR10bit 环境为ubuntu16.04
1. 编译X265,生成静态库, 安装到默认目录 修改CMakeLists.txt 使 HIGH_BIT_DEPTH 设置为ON cmake -G "Unix Makefiles&qu ...
- JS笛卡尔积算法与多重数组笛卡尔积实现方法示例
js 笛卡尔积算法的实现代码,据对象或者数组生成笛卡尔积,并介绍了一个javascript多重数组笛卡尔积的例子,以及java实现笛卡尔积的算法与实例代码. 一.javascript笛卡尔积算法代码 ...
- Spring Cloud(十)高可用的分布式配置中心 Spring Cloud Config 中使用 Refresh
上一篇文章讲了SpringCloudConfig 集成Git仓库,配和 Eureka 注册中心一起使用,但是我们会发现,修改了Git仓库的配置后,需要重启服务,才可以得到最新的配置,这一篇我们尝试使用 ...
- Centos 6.5 版本的下载教程
1.CentOS下载CentOS是免费版,推荐在官网上直接下载,网址:https://www.centos.org/download/ 2.选择版本推荐6.5 3.选择isos 4.根据系统电脑的配置 ...
- Mac上使用sunlogin向日葵软件远程控制电脑
1 安装软件 控制端和客户端都安装 https://sunlogin.oray.com/personal/download/ 2 再两台电脑上都安装好客户端和控制端后,打开控制端软件 可以看到自己登录 ...
- 【异常】hbase启动后hdfs文件权限目录不一致,导致Phoenix无法删除表结构
1 异常信息 Received error when attempting to archive files ([class org.apache.hadoop.hbase.backup.HFileA ...