原文地址:http://tw.myblog.yahoo.com/jeff-yeh/article?mid=603&prev=605&next=597

本来是繁体,让我转成简体了,如下

很多人应该都经历过一段T-SQL的学习成长路程,最多人最常用的就是直接把使用者输入的值,直接组到查询字符串里.

例如 :

string strCmd="select * from testdb where testid ='"+TextBox1.Text.Trim()+";"; 

很多范例及书籍都有这样的写法,可是这写法有很严重的SQL Injection的问题,这也不是个新问题,这是很久以前就有发现的,有些人还以为Hot Fix或Service Pack可以修正SQL Injection的问题,但这是程序写法的问题,跟Hot Fix或Service Pack没有关系.

记得过去有位同事,有多年的程序撰写经验,后来跟我一起Work了一段时间,他的写法也是如此,当时提出这个安全问题时,还不被重视,但小弟手就是贱,为了让上头重视这个问题,只好自己动手去"注射"了,我没做什么,就很单纯的关掉DB而已,后来上头才发现这个问题的严重性,才要求更改.

后来陆续对安全性的重视提高了,开始想着要怎么去解决这个问题,就延伸出第二种写法,开始去过滤关键词,置换等消极的方式,有时还会发现新的问题,所以就一直修不停.

例如 :

string strCmd="select * from testdb where testid ='"+TextBox1.Text.Trim().Replace("'","%")+";";

这只是示意性的换掉单引号,但还有很多关键词或符号.

后来决定要想办法把使用者的查询值放到Parameters的方式去处理,而做法也没想象中的难.

以like的问题来说:

SqlCommand cmd=new SqlComand(); //其它怎么用Connection等,因为不是重点,所以带过不写

cmd.Parameters.Add("@testid",TextBox1.Text.Trim());

cmd.CommandText="select * from testdb where testid like @testid+'%'";

这样就能做到 like TextBox1.Text.Trim()% 的效果,而且不用担心使用者输入的字有什么关键词在里面.

那么in要怎么做?

会用in的时候,一定是有很多查询的值要查,所以做法有很多种,但意思差不多.

例如我的查询条件有"Jeff","Jack","Jay","Jason",将这些条件个个分开放到一个String Arrary里.

SqlCommand cmd=new SqlComand(); //其它怎么用Connection等,因为不是重点,所以带过不写

cmd.CommandText="select * from testdb where testid in (";

string strName="Jeff,Jack,Jay,Jason";//要用in查询的数据

string[] strQry=strName.Split(",".ToCharArray());//把它切到String Array里去

int intCount=0;

foreach (string sq in strQry)

{

cmd.Parameters.Add("@TestID"+intCount, sq) //所以每次的变量都会不同

cmd.CommandText+="@TestID"+intCount+",";

intCount++;//变数加1

}

cmd.CommandText=cmd.CommandText.Remove(cmd.CommandText.Length-1,1)+")"; //把最后一个逗号换为右括号.

最后就会组出select * from testdb where testid in (@TestID0,@TestID1,@TestID2,@TestID3)

未来会不会有第四种改进写法,就不知道了,看各位有没有什么好看法,或是未来会不会我又有遇到什么问题可以动动脑.

#2008/9/13 补充

在网友提供的信息,发现用Parameters,在用Like时,使用者输入的%也是当通配符在使用.例如:

cmd.Parameters.Add("@testid","Jeff%");

cmd.CommandText="select * from testdb where testid like @testid";

查询结果会将所有的Jeff开头的数据取回,而底线 _ 的单一字的通配符也是有同样的效果,那这样用户真的想要找数据内有%或是_时的数据时,要怎么辨才能达成?目前是想到一个方法,但要用到escape这个方式.

例如 :

cmd.Parameters.Add("@testid","Jeff%".Relpace("!","!!").Relpace("%","!%").Relpace("_","!_")+"%");

cmd.CommandText="select * from testdb where testid like @testid escape '!'";

前三个Relpace的动作,是把使用者输入的! (因为escape 符号是用!),%及_都在前面加个!,让它被视为原意做为查询条件,最后加上的%,因为没前面先加!,所以最后一个%仍为通配符使用,所以举例数据库的数据如下:

Jeff1

Jeff%1

Jeff%2

Jeff%_1

Jeff2

查询结果会是 :

Jeff%1

Jeff%2

Jeff%_1

这是目前想到的做法~

转载于:https://www.cnblogs.com/sdqxcxh/archive/2010/08/13/1798991.html

SQL语法用like %或in时Parameters要怎么用才能避免SQL Injection的问题相关推荐

  1. mysql语法错误文件_使用logstash同步MySQL的数据时,在jdbc查询sql文件时报sql语法错误,sql文件是navicat生成的...

    使用logstash同步MySQL的数据时,在jdbc查询sql文件时报sql语法错误,并且错误总是near在第1行,sql文件的编码是utf8mb64 ,不知道是否是编码问题 logstash配置j ...

  2. 使用ANTLR做一个简单的Python SQL语法解析器 - 推酷

    使用ANTLR做一个简单的Python SQL语法解析器 - 推酷 使用ANTLR做一个简单的Python SQL语法解析器 - 推酷 posted on 2016-11-14 13:11 lexus ...

  3. Spring5使用JDBCTemplate批处理添加数据时提示SQL语法有错

    目录 问题描述 解决方案 问题描述 今天在使用Spring5框架时,用JDBCTemplate技术来操作数据库,一开始增删改查都好好的,后来使用jdbcTemplate.batchUpdate()进行 ...

  4. LINQ To SQL 语法及实例大全

    LINQ to SQL语句(1)之Where Where操作 适用场景:实现过滤,查询等功能. 说明:与SQL命令中的Where作用相似,都是起到范围限定也就是过滤作用的,而判断条件就是它后面所接的子 ...

  5. C#--Link to sql语法大全

    最近学习C#,这个博客讲的很详细详细,转了! LINQ to SQL语句(1)之Where Where操作 适用场景:实现过滤,查询等功能. 说明:与SQL命令中的Where作用相似,都是起到范围限定 ...

  6. ClickHouse SQL 语法极简教程

    ClickHouse SQL 语法极简教程 ClickHouse是一个用于联机分析(OLAP)的列式数据库管理系统(DBMS). 在传统的行式数据库系统中,数据按如下顺序存储: Row WatchID ...

  7. SQL 语法速成手册

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:静默虚空 排版:MarkerHub 原文:https://j ...

  8. 1.2W 字的 SQL 语法速成手册

    来源 |https://juejin.im/post/5c7e524af265da2d914db18f 本文针对关系型数据库的一般语法.限于篇幅,本文侧重说明用法,不会展开讲解特性.原理.本文内容包括 ...

  9. SQL语法中drop,delete与truncate的区别

    SQL语法中drop,delete与truncate的区别 delete是DML语句,可以选择删除部分数据,也可以选择删除全部数据:删除的数据可以回滚:不会释放空间 drop是DDL语句,删除表结构和 ...

最新文章

  1. 电大工商管理计算机考试,东方电大工商管理专科计算机期末复习EXCEL五题.docx...
  2. ML与math:机器学习与高等数学基础概念、代码实现、案例应用之详细攻略——进阶篇
  3. Scala 中下划线的用法
  4. java面包屑实现_在Java中实现过滤器和面包店锁
  5. homebrew长时间停在Updating Homebrew 这个步骤
  6. python3.6里有xhr吗_python – XHR请求URL在尝试解析其内容时不存在
  7. 新来的前端小姐姐问:Vue路由history模式刷新页面出现404问题
  8. flutter java混编_有赞 Flutter 混编方案
  9. Entity(Table)(Id) cannot be resolved to a type(spring boot)
  10. 神经网络常见问题和技巧(持续更新)
  11. matlab随机线性微分方程,基于MATLAB的随机线性微分方程的求解
  12. PMP的含金量价值主要表现在哪些方面?
  13. 卷积神经网络基本原理
  14. 搞懂:1.数据流图UML2.单代号网络图绘制3.双代号网络图绘制、工作计算法、关键路径法(含例题)
  15. 什么是http协议?
  16. HCU混和动力控制器,HEV混动串并联 混动车辆
  17. Java泛型比较大小
  18. Codevs 2822 爱在心中
  19. 基于js实现的简易记账小本
  20. 如何防范SQL注入 SQL注入测试

热门文章

  1. sql int 比较_SQL进阶--错题集1
  2. 从零开始刷Leetcode——数组(941.977)
  3. 安利几个优质nlp开源项目
  4. Github Star 9.7K,超级好用的OCR数据合成与半自动标注工具,强烈推荐!
  5. 基于BERT 的中文数据集下的命名实体识别(NER)
  6. 帮内推 | 免费送50个推荐算法工程师的高薪offer!
  7. 基于卷积神经网络的图像情感分析模型,Python实现
  8. php yaf框架 校验登录,yaf框架是get或post请求的判断
  9. 5Python全站之路系列之MySL连表查询
  10. 先说一下JS的获取方法,其要比JQUERY的方法麻烦很多,后面以JQUERY的方法作对比。...