参数化查询为什么能够防止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=&gt;o.CustomerId.Contains(customerId));
 

最新文章

  1. [LeetCode] Product of Array Except Self 除本身之外的数组之积
  2. PLSQL操作excel
  3. Jena TDB assembler syntax
  4. python算法:rangeBitwiseAnd(连续整数的与)
  5. G面经prepare: Android Phone Unlock Pattern
  6. poj 2484 A Funny Game(博弈)
  7. Android学习总结——强制下线功能(广播)
  8. PHP自练项目之数字与文字的分页效果在函数中实现
  9. 【集美大学1411_助教博客】团队作业10——项目复审与事后分析(Beta版本)
  10. HBuilder真机联调、手机运行
  11. 【原创】那些年用过的Redis集群架构(含面试解析)
  12. 201771010118 马昕璐《面向对象程序设计java》第十二周学习总结
  13. XML与HTML的作用不同
  14. 水晶报表,快速报表,rdlc报表
  15. Dapp的PVP发模式--magic-maze-2d游戏解读
  16. temp--内蒙农信出差
  17. webpack学习笔记——打包js
  18. 《Visual C# 从入门到精通》第一章使用变量、操作符和表达式——读书笔记
  19. Spring mvc 加载HTML静态页面
  20. 9、链表 &amp; 状态机 &amp; 多线程

热门文章

  1. (二十八)动态盐的MD5加密算法(java实现)
  2. Block Breaker HDU - 6699(深搜,水,写下涨涨记性)
  3. fiddler笔记:与Web Session的交互
  4. Jobs(二) Servlet的配置
  5. Java 私有构造函数的使用
  6. 关于vue-router当中addRoutes的使用
  7. 怎样创建一个canvas画布环境
  8. C#异步编程中的最佳实践(做法)
  9. 基于【 Docker】一 || ElK安装部署使用教程
  10. PM2 部署 nodejs API项目