参数化查询原理

参数化查询原理机房重构敲组合查询时 会遇到多个操作符 因为之前在使用参数化查询时只要遇到给数据库赋值时就使用参数 光知道这样能防止 SQL 注入 直到如今才知道它为什么能防止 SQL 注入 索性就把操作符也用成参数 但这时就报 语法错误 了 可是解决了很长时间 老以为是 sql 语句写错了 自我认为是那种丢掉一个空格或引号之类的错误 其实是没真正理解之前听到到 防 SQL 注入 的原理 或是说为什么能 防

       机房重构敲组合查询时,会遇到多个操作符(+、-、*、/),因为之前在使用参数化查询时只要遇到给数据库赋值时就使用参数,(光知道这样能防止SQL注入,直到如今才知道它为什么能防止SQL注入)索性就把操作符也用成参数,但这时就报“语法错误”了,可是解决了很长时间,老以为是sql语句写错了(自我认为是那种丢掉一个空格或引号之类的错误),其实是没真正理解之前听到到“防SQL注入”的原理,或是说为什么能“防止SQL注入”



一:参数化查询原理

       参数化查询是指在设计与数据库链接并访问时,在需要数值或数据的地方,使用参数来给值。即在使用参数化查询的情况下,数据库服务器不会将参数的内容视为SQL指令的一部分来处理,而是在数据库完成SQL指令的编译后,才套用参数运行,因此就算参数中有恶意的指令,由于已经编译完成,就不会被数据库运行。目前,参数化查询是最有效可预防SQL注入攻击的的防御方法。(虽为度娘所说,但这几句对我所遇到的问题的理解起到很大帮助和理解)



二:实例解析

       就以我遇到的问题说来,我把“+、-、*、/”作为参数传进SQL语句中,这样是不对的

起初我的SQL语句是这样的,  

参数化查询原理

报如下错误:

                                           参数化查询原理

跟踪到链接数据库之前的sql语句是这样的:

                                           参数化查询原理

      而标准的SQL语句是:select 列名 from 表名( where  列名  操作符  查询内容)

而上面跟踪的sql语句中where条件里没有操作符(+、-、*、/)而是一个参数,所以该条SQL语句根本不符合sql语句的语法,即不是一条SQL语句



SQL语句改为:

参数化查询原理

跟踪到链接数据库之前的SQL语句是:

                                             参数化查询原理

结果:

      这样就是一条标准的SQL语句了,所以此问题就这样解决了。(虽然列名还是参数,但只看该条语句是符合SQL语句标准的格式,在实际链接数据库时就给参数赋值了)



三:防SQL注入

       其实参数化查询的作用主要有两点:

              1:参数过滤

              2:执行计划重用

       而防止SQL注入主要就是利用了执行计划重用

       即在链接数据库时给参数赋值时,重用了以前的执行计划,没有对SQL语句重新编译,也就没有重新执行语法解析,所以语句还是原来的结构,符合标准,只是用一个具体的值替换参数。

      其实这个问题的背后隐藏着很多知识:最重要的一条是:SQL SERVER接收到一条sql指令所做的工作:

       简单概括为:收到指令 -> 编译SQL生成执行计划 ->选择执行计划 ->执行执行计划。

       当 Sql Server 收到任何一个指令,包括:查询、批处理、存储过程、触发器、预编译指令和动态SQL Server语句,要完成语法解析、语义分析,然后再进行”编译”,生成能够运行的”执行计划“。在编译的过程中,SQL Server 会根据所涉及的对象的架构、统计信息,以及指令的具体内容,估算可能的执行计划,以及它们的成本,最后选择一个SQL Server认为成本最低的语句。

      执行计划生成之后,SQL Server 通常会把它们缓存到内存里,术语统称它们叫“Plane Cache”。以后同样的语句执行,SQL Server就可以使用同样的执行计划,而无须再做一次编译。这种行为,叫做“重用”。但是有时候,哪怕是一模一样的语句,SQL Server 下次执行还是要再做一次编译。这种行为叫“重编译”。执行计划的编译和重编译都是要耗费资源的。

详细讲解:http://blog.csdn.net/babauyang/article/details/



四:总结

      每个问题的的背后可能会有好多知识点,这些知识点不一定要都吃透,但要明白问题的根源,这样遇到同样原理的问题时才能在节省时间的前提下保质的解决问题,否则虽说此问题解决了,但遇到同样原理的问题时还是不知道如何解决,以此又得浪费好长时间来解决,出来混总是要还的。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/231686.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • java 刷屏器「建议收藏」

    java 刷屏器「建议收藏」本想做个聊天机器人,最终还是获取不了聊天信息,只能写了个刷屏器,仅供娱乐。importjava.awt.AWTException;importjava.awt.Robot;importjava.awt.Toolkit;importjava.awt.datatransfer.StringSelection;importjava.awt.event.KeyEvent;imp

    2022年5月31日
    27
  • mask rcnn实现教程「建议收藏」

    mask rcnn实现教程「建议收藏」一,首先去github上下载mask-rcnn源码,这里提供一个百度网盘地址链接:https://pan.baidu.com/s/1htJYyNy密码:0r2b含可运行DEMO更新链接:https://pan.baidu.com/s/1HBPtIPz0xpZsCprl7rc6hw密码:bvm5二,下载对应的mask_rcnn_coco.h5模型,这里给出百度网盘下载地址链接:h……

    2022年10月4日
    3
  • hibernate和mybatisplus区别_hibernate sql

    hibernate和mybatisplus区别_hibernate sqlHibernate与Mybatis对比

    2025年10月24日
    2
  • arraylist和linkedlist的区别_arraylist 和linkedlist

    arraylist和linkedlist的区别_arraylist 和linkedlist       这段时间把疯狂JAVA再看了一遍,发现Stack,ArrayDeque,LinkedList都可以作为栈使用,所以就稍微从性能以及实现的细节对比这三者的区别。类继承树       由继承树看出,三者都是Collection的间接实现类。&

    2022年9月20日
    2
  • stm32cubemx软件库_STM32cube

    stm32cubemx软件库_STM32cube前言:本系列教程将HAL库与STM32CubeMX结合在一起讲解,使您可以更快速的学会各个模块的使用在我们的HAL库中,对硬件SPI函数做了很好的集成,使得之前SPI几百行代码,在HAL库中,只需要寥寥几行就可以完成那么这篇文章将带你去感受下它的优异之处,这些优异的函数,也正是HAL库的优点所在所用工具:1、芯片:STM32F103ZET62、STM32CubeMx软件3、IDE:…

    2022年8月31日
    4
  • 背板管理——“绿色”点亮IDC

    背板管理——“绿色”点亮IDC

    2021年7月29日
    53

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号