防止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表单验证的输入框中,提交到服务器,以达到越过 ...
随机推荐
- centos8自定义目录安装php7.3
1.目录结构 源码目录:/home/werben/pkgsrc/php-7.3.11 安装目录:/home/werben/application/php7.3.11 2.下载php源码 # 官网地址: ...
- python之并发编程(概念篇)
一.进程 1.什么是进程 进程是正在进行的一个过程或者一个任务.而负责执行任务的则是cpu. 2.进程与程序的区别 程序并不能单独运行,只有将程序装载到内存中,系统为它分配资源才能运行,而这种执行的程 ...
- PHP max_input_var设为了1000导致post数组太多时无法接受后面的参数值
PHP max_input_var设为了1000导致post数组太多时无法接受后面的参数值 下午突然接到格力电话说无法批量设置门店任务,但是在测试环境下无法重现,测试环境下好好的. 然后登陆到生产环境 ...
- CSS实现单选按钮
import React from 'react' import PropTypes from 'prop-types' import CX from 'classnames' import _ fr ...
- MySQL 索引的优化
一.MySQL如何使用索引(index) 1.1 索引概述 索引用于快速查找具有特定列值的行. 如果不使用索引,MySQL必须从表的第一行开始,然后扫描整个表来寻找符合条件的行.这种情况下,表越大,扫 ...
- Unity 屏幕坐标到UGUI RectTransform本地坐标的转换
public static bool ScreenPointToLocalPointInRectangle(RectTransform rect, Vector2 screenPoint, Camer ...
- 偏移动画(TranslateTransform)
用户界面组件.图像元素和多媒体功能可以让我们的界面生动活泼,除此之外,Silverlight还具备动画功能,它可以让应用程序“动起来”.实际上,英文中Animation这个单词的意思是给某物带来生命. ...
- arcgis js 之 渔网工具(调用地图服务)
arcgis js 之 渔网工具(调用地图服务) 原理: 简历不同级别的网渔网图层,设置显示比例尺.然后发布服务,使用MapImageLayer接收. 过程: 1.在arcmap中用创建渔网工具将不同 ...
- SpringCloud多网卡配置(转)
https://blog.csdn.net/lixiang987654321/article/details/88134324 docker部署过程中遇到如下问题: (1)docker容器创建之后,进 ...
- 手写走通HTTP server 第三版本
后台 后端 服务端 功能:逻辑处理 算法处理 磁盘交互(数据库 静态文件处理) 要求:健壮性,安全性 并发性能和处理速度 架构合理便于维护扩展 网站后端 httpserver + WebFr ...