SQL查询需要处理的特殊字符.docVIP

  • 5
  • 0
  • 约5.38千字
  • 约 12页
  • 2018-05-28 发布于河南
  • 举报
SQL查询需要处理的特殊字符

SQL查询需要处理的特殊字符 转]SQL查询中的特殊字符处理 我们都知道SQL查询过程中,单引号“”是特殊字符,所以在查询的时候要转换成双单引号“”。 但这只是特殊字符的一个,在实际项目中,发现对于like操作还有以下特殊字符:下划线“_”,百分号“%”,方括号“[]”以及尖号“^”。 其用途如下: 下划线:用于代替一个任意字符(相当于正则表达式中的 ? ) 百分号:用于代替任意数目的任意字符(相当于正则表达式中的 * ) 方括号:用于转义(事实上只有左方括号用于转义,右方括号使用最近优先原则匹配最近的左方括号) 尖号:用于排除一些字符进行匹配(这个与正则表达式中的一样) 以下是一些匹配的举例,需要说明的是,只有like操作才有这些特殊字符,=操作是没有的。 a_b... a[_]b% a%b... a[%]b% a[b... a[[]b% a]b... a]b% a[]b... a[[]]b% a[^]b... a[[][^]]b% a[^^]b... a[[][^][^]]b% 在实际进行处理的时候,对于=操作,我们一般只需要如此替换: - 对于like操作,需要进行以下替换(注意顺序也很重要) [ - [[] (这个必须是第一个替换的!!) % - [%] (这里%是指希望匹配的字符本身包括的%而不是专门用于匹配的通配符) _ - [_] ^ - [^] 一定要对用户可能输入的诸如引号,尖括号等特殊字符给予足够重视,它们可能引发严重的安全问题。SQL注入的基本手法之一,就是利用对单引号未加过滤的安全漏洞。 用户的输入无非两个用途:对数据库操作或显示在页面上,下面分别对这两种情况下特殊字符的处理加以说明。 1. 对数据库操作 用户输入的数据用于对数据库进行操作时,又分为两种情况,一是进行写库操作,二是作为查询条件。 1.1 写库操作 (insert及update都视为写库操作,这果以insert为例说明,update的处理相同) 一般采用insert语句或AddNew方法两种方式进行写库操作,我们先来看insert语句: DIM username,sqlstr username = trim(Request.Form(uname)) sqlstr = insert into [userinfo] (username) values ( username ) 以SQL Server为例,使用这种方式写库,如果username中含用单引号(),会出错。使用下面的自定义函数,可以将单引号进行转换: Rem 转换SQL非法字符 function SQLEncode(fString) if isnull(fString) then SQLEncode = exit function end if SQLEncode=replace(fString,,) end function 以上函数将一个单引号转换为两个连续的单引号,数据库能够接受,并以一个单引号写入。SQL语句改为: sqlstr = insert into [userinfo] (username) values ( SQLEncode(username) ) 再来看AddNew方法: DIM username username = trim(Request.Form(uname)) MyRst为Recordset对象,MyConn为Connection对象 MyRst.open [userinfo],MyConn,0,3 MyRst.AddNew MyRst(username).Value = username MyRst.Update MyRst.Close 使用这种方式写库时,不必调用SQLEncode()对单引号进行转换,数据库会自行处理。 对于存储过程的的参数,同样不必进行单引号的转换。 建议大家利用存储过程进行操作,好处嘛,我在《ASP与存储过程》一文中已做了阐述。否则,建议使用AddNew方法写库,好处不仅仅在于避免对单引号进行处理,本文对此不作深入探讨。 1.2 用户输入做为查询条件 网页教学网 如果用户输入的数据作为查询条件出现在where子句中,不论该where子句属于update语句、delete语句还是select语句,都要对单引号进行转换。 2. 用户输入的数据作为输出,显示在页面上 我们这里只讨论不允许用户使用HTML代码的情况,也就是说,即使用户输入了HTML代码,这些数据也不会以HTML代码的形式显示。至于允许用户使用HTML代码的情况,比较复杂,以后专文探讨。 用户

文档评论(0)

1亿VIP精品文档

相关文档