sql语言特殊字符处理

我们都知道SQL Server查询过程中,单引号“'”是特殊字符,所以在查询的时候要转换成双单引号“''”。
但这只是特殊字符的一个,在实际项目中,发现对于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语句中,有些特殊字符,是sql保留的。比如 ' [ ] 等。我们可以先看看它们的用法。

当需要查询某数据时,加入条件语句,或着当你需要insert记录时,我们用 ' 来将字符类型的数据引起来。比如:
Select * from Customers where City = 'London'

当表的名字或列的名字中,含有空格等一些特殊字符时,我们需要用[] 将表名引起来,告诉语法分析器,[]号内的才是一个完整的名称。比如

Select * from [Order Details]

如果,字符数据中,含有 ' 改怎么办呢?其实,好多人在这里并没有处理字符川中 ' 符号,才造成sql 注射危险。就那上面的那个例子。在Sql语句拼接的时代,比如

string sql = "select * from Customers where CustomerID = '" + temp + "'";

如果,我给temp赋值为 Tom' or 1=1 --- 
那么你拼接起来的语句为 select * from Customers where CustomerID = 'Tom' or 1=1 --- '
哈哈,1=1 衡为真,---会把后面的sql语句注释掉。而前面因为有输入的 ' 而使的语句是合法的。那or的条件,会把所有的记录都选出来。这就是sql注入。在做用户登陆时,如果没有处理该问题,那你的系统受危害的可能性会很高的。
如何处理字符数据中的 ' 符号呢? 方法很简单,用两个 ' 符号代替一个。 比如,其实际传入的值为Lon'don,处理后为
Select * from Customers where City = 'Lon''don'
就可以了。

如果表或列的名称中含有 [ 或 ] 字符呢?比如Select * from [Order] Details],那中间 ] 符号岂不是先和第一个[ 配了。后面的就是非法的了。怎么办呢? 简单,使用 ]] 代替 ] 。对于[,则无须处理。那就该为
Select * from [Order]] Details]。

转载于:https://www.cnblogs.com/henryhappier/archive/2010/01/25/1656171.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/536361.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

小节

算法导论已学两部分,第一部分是基础知识,第二部分是排序。基础知识介绍如何分析证明算法以及求时间复杂度。第二部分的排序学了很长时间。先是从简单排序到复杂排序的一个过渡,打开了很多思路。然后就是无尽的算法分析。算法分析的时间比理解…

SPS2003升级到MOSS2007相关资料及问题总结

这几天要把客户的SPS2003门户升级到MOSS2007的,客户SPS2003门户,数据26G,使用了自定义WebPart、自定义页面、SSO等功能。升级过程中碰到大量问题。其中主要的问题有几个,在这里把它们整理一下> 1、sps2003升级时,升…

Milking Time【动态规划-dp】

Milking Time POJ - 3616 Bessie is such a hard-working cow. In fact, she is so focused on maximizing her productivity that she decides to schedule her next N (1 ≤ N ≤ 1,000,000) hours (conveniently labeled 0..N-1) so that she produces as much milk as po…

HTTP首部(1)

1、报文首部 HTTP协议的请求和响应必定包含HTTP首部,它包括了客户端和服务端分别处理请求和响应提供所需要的信息。报文主体字儿是所需要的用户和资源的信息都在这边。  HTTP请求报文组成 方法,URL,HTTP版本,HTTP首部字段 HTTP响…

UVA272--TEX Quotes【字符串】

TEX Quotes UVA - 272 题目传送门 题目大意&#xff1a;将输入字符串中的所有对双引号的做双引号改为 &#xff0c;右双引号改为 。 解决方法&#xff1a;遍历一遍及时修改即可。 AC代码&#xff1a; #include <cstdio> #include <iostream> #include <…

XMLHttpRequest+WebForm模式(接口IHttpHandler)实现ajax

首先引入ajax.js文件 创建xmlhttpRequest对象 Code//创建XMLHttpRequest对象var xmlHttp;function newXMLHttpRequest() { if (window.XMLHttpRequest) { xmlHttp new XMLHttpRequest(); } else if (window.ActiveXObject) { try { xmlHttp …

UVA----10082 WERTYU【字符串】

WERTYU UVA - 10082 题目传送门 题目大意&#xff1a;按照所给的键盘样式&#xff0c;以及错误的字符串&#xff0c;输出正确的字符串&#xff0c;其输入的每一个字符都按照键盘样式向右错移了一位。 解决方法&#xff1a;将整个键盘用数组存起来&#xff0c;遍历一遍即可。…

关于C生成的汇编与C++生成的汇编在函数名称上的差异

最近用到ucos&#xff0c;这个RTOS本身是用C语言和部分汇编编写&#xff0c;而自己又打算用C来写应用&#xff0c;在其中遇到几个问题&#xff0c;一番折腾之后&#xff0c;让我更加深刻认识到了在一些一般不注意的细节上&#xff0c;C与C的不同。 1、对于ucos&#xff0c;虽…

UVA401 ​​​​​​​Palindromes【字符串】

Palindromes UVA - 401 题目传送门 题目大意&#xff1a;给你一个字符串&#xff0c;判断其是回文串还是镜像串。 AC代码&#xff1a; #include <cstdio> #include <iostream> #include <algorithm> #include <cmath> #include <cstdlib> #…

IIS 5 与IIS 6 原理介绍

[ 转] ASP.NET Process Model之一&#xff1a;IIS 和 ASP.NET ISAPI 前几天有一个朋友在MSN上问我“ASP.NET 从最初的接收到Http request到最终生成Response的整个流程到底是怎样的&#xff1f;”我觉得这个问题涉及到IIS和ASP.NETASP.NET Runtime的处理模型的问题&#xff0c;…

UVA340 ​​​​​​​Master-Mind Hints【数组】

Master-Mind Hints UVA - 340 题目传送门 题目大意&#xff1a;先输入一个整数n&#xff0c;表示有n个数字&#xff0c;下面第一行代表正确答案&#xff0c;其下每一行代表用户猜的答案&#xff0c;需统计其有多少数字位置正确&#xff08;A&#xff09;&#xff0c;有多少数…

教你如何把自己从好友的QQ中删除

在QQ中&#xff0c;有些人看了不太顺眼&#xff0c;真不知当初为何让他加自己为好友的&#xff01; 那有什么办法&#xff0c;可以把自己从对方的QQ中删除呢&#xff1f; 其实&#xff0c;用QQ就可以轻松搞定&#xff01; 让我来为你支一招吧&#xff01; 打开QQ&#xff0…

UVA1583 Digit Generator

Digit Generator UVA - 1583 题目传送门 题目大意&#xff1a;若x的各位数之和加上x本身等于y&#xff0c;则证明x是y的生成元&#xff0c;求输入数字n的最小生成元。 AC代码&#xff1a; #include <cstdio> #include <iostream> #include <algorithm> …

C++内存详解

伟大的Bill Gates 曾经失言&#xff1a; 640K ought to be enough for everybody — Bill Gates 1981 程序员们经常编写内存管理程序&#xff0c;往往提心吊胆。如果不想触雷&#xff0c;唯一的解决办法就是发现所有潜伏的地雷并且排除它们&#xff0c;躲是躲不了的。本文的内…

UVA1584 ​​​​​​​Circular Sequence【字符串】

Circular Sequence UVA - 1584 题目传送门 题目大意&#xff1a;输入一个环形字符串&#xff0c;需输出其最小字典序的形式的字符串。 AC代码&#xff1a; #include <cstdio> #include <iostream> #include <algorithm> #include <cmath> #includ…

UVA1585 Score

Score UVA - 1585 题目传送门 题目大意&#xff1a;输入一个字符串&#xff0c;O的分数为1&#xff0c;若出现连续的O&#xff0c;如OOOO...&#xff0c;分数为1,2,3,4...&#xff0c;X为0分&#xff0c;求最终的分数 AC代码&#xff1a; #include <cstdio> #includ…

operater int()

class Number { int number; public: explicit Number(int n){number n;} operator int() //注意一定不能声明返回值 { return number; } }; int main () { Number n1 Number(100); int n2 n1; cout << n2 << endl; re…

UVA1586 ​​​​​​​ Molar mass

Molar mass UVA - 1586 题目传送门 题目大意&#xff1a;给你一个只包含C,H,O,N分子式&#xff0c;其中C,H,O,N的原子量分别为&#xff1a;12.01,1.008,16.00,14.01&#xff0c;求其分子量 AC代码&#xff1a; #include <cstdio> #include <iostream> #includ…

SharePoint v3:忘掉模拟用户Impersonate,SPSecurity.RunWithElevatedPrivileges来了

回顾&#xff1a; 在SharePoint V2 大家应该都用过模拟用户Impersonate这个功能&#xff0c; 这个功能用来暂时提升某个用户的权限&#xff0c;比如某个普通用户的本来不能修改某个列表的值&#xff0c;但是我们功能需要在修改。 缺点&#xff1a; 我们使用这个模拟用户功能…

UVA1225 ​​​​​​​Digit Counting

Digit Counting UVA - 1225 题目传送门 题目大意&#xff1a;输入一个数字T&#xff0c;代表有T组测试数据&#xff0c;下面每行有一个整数n&#xff0c;求将1到n的数字连成一串后每个数字出现的个数。 AC代码&#xff1a; #include <cstdio> #include <iostream&…