参数化查询和预编译的区别,参数化查询可以防止sql注入

  参数化查询和预编译的区别,参数化查询可以防止sql注入

  众所周知,参数化查询有很多优点,比如防止SQL注入,提高查询效率,那么为什么参数化查询可以解决这些问题呢?

  1、参数化查询防止SQL注入

  参数化查询,顾名思义,就是我们写出需要的参数,然后直接给它们赋值,就像sql的一个框架。查询sql时,会进行参数分析。如果分析的结果是我们使用了这样的框架,那么sql将重用查询计划,否则,将重新生成查询计划。当然,这个时候sql的语义肯定是发生了变化,然后我们就可以很好的防止注入的发生。

  例如

  上面的代码是使用参数化的查询语句,尝试输入注入的字符,结果当然是什么也找不到!

  2.参数化查询提高了查询效率。为了提高sql的执行速度,请在SqlParameter参数中添加SqlDbType和size属性。很多开发人员在编译参数化查询代码的过程中忽略了指定查询参数的类型,会导致托管代码在执行过程中无法自动识别参数类型,然后扫描这个字段的内容来确定参数类型并进行转换,从而消耗了不必要的查询性能。

  例如,如果传递的值是 username ,则大小值是8,如果是 username1 ,则大小值是9。那么,不同的尺寸值会导致什么样的结果呢?并且测试表明size的不同取值会导致数据库执行计划不被重用,这样每次执行sql都会生成一个新的执行计划,浪费数据库执行时间。

  也就是说,如果参数的大小值不同,将重新创建一个查询计划,但如果我们将它们的大小值设置为50,则每次执行sql时都会重用该查询计划,从而提高效率。

  以上两点的实现都提到了重用查询计划,那么什么是查询计划呢?什么时候会重用查询计划?在执行查询语句之前,Sql Server对其进行编译并生成查询计划,该计划告诉Sql Server的查询引擎如何工作。Sql Server会根据目前能收集到的各种信息(如内存大小、索引统计等)将一条查询语句编译成“最优”的查询计划。).显然,得到这样一个查询计划是需要占用CPU资源的,而且大部分查询语句总是用同一个查询计划编译的。因此,除非指定了RECOMPILE选项,否则Sql Server将在执行查询语句时缓存查询计划3354。也就是说,如果是同一个查询语句,Sql Server只会编译一次,然后每次都重用查询计划。

参数化查询和预编译的区别,参数化查询可以防止sql注入