1. 数据库查询转义字符
A\b本身是转义字符正确. B如果要16进制,需要写成'\xf'字符转义的时候不需要写0x的. C'\037'才对,这种是8进制转义. D这里应该不是双引号而是'\''即两个单引号包含的一个\'表示单引号转义. 如果不是你打错了话,那么BC都是错的.
2. 数据库数值转字符
输入掩码属性所使用的字符含义有如下:
0:必须输入数字(0—9),不允许使用加号+和减号-。
9:可选择输入数字或空格,不允许使用加号和减号。
#:可选择输入数字或空格,允许使用加号和减号,空白会转换为空格。
L:必须输入字母(A—Z)。 ?:可选择输入字母(A—Z)。
A:必须输入字母或数字。
a:可选择输入字母或数字。
&:必须输入任一字符或空格。
C:可选择输入任一字符或空格。
<:使其后所有字符转换为小写。
>:使其后所有字符转换为大写。 !:使输入掩码从右到左显示。
(反斜杠):使其后的字符显示为原义字符。
密码:文本框中输入的任何字符都按字面字符保存,但显示为星号*。
3. sql字符串转义
一、为什么会有SQL注入
是用户输入的内容在服务器中能够被拼接查询,从而输出恶意用户期望的内容,那么要防止SQL注入,就是阻止恶意用户输入的恶意信息被数据库执行并且输出。
1. 对于数字型注入,不需要单引号个的情况下
可以将payload跟在参数后边,不受过滤和转义的影响
$id=$_POST['id'];
$sql = select username from users where id= $id union select database();
2. 宽字节注入(但是要使用gbk编码)
在使用gbk编码时,系统会认为两个字符是一个汉字的编码(前一个字符必须大于128)。
输入%df%27时首先经过上面提到的单引号转义变成了%df%5c%27(%5c是反斜杠\),之后在数据库查询前由于使用了GBK多字节编码,即在汉字编码范围内两个字节会被编码为一个汉字。然后MySQL服务器会对查询语句进行GBK编码即%df%5c转换成了汉字“運”,而单引号逃逸了出来
3. 使用编码的形式
查询的数据在经过webserver时会被解码一次
id=1%2527 --->webserver --> id=1%27 --> urldecode--> 1'
4. 二次注入
二次注入漏洞字面上理解可能就是结合两个注入漏洞点实现sql注入的目的,但是这其中还有几个细节需要讲解一下。首先,第一个注入点因为经过过滤处理所以无法触发SQL注入漏洞,比如addslashes函数,将单引号等字符转义变成\’。但是存进数据库后,数据又被还原了,也就是反斜杠没了,在这种情况下,如果能发现一个新的注入同时引用了被插入了的数据库数据,就可以实现闭合新发现的注入漏洞引发漏洞。
二、如何防止SQL注入
通过上边的四种方式完美的绕过了反斜杠和单引号转义是否能防止SQL注入的问题,哪如何能防止SQL注入呢?
1、所有的查询语句都使用数据库提供的参数化查询接口,参数化的语句使用参数而不是将用户输入变量嵌入到SQL语句中。当前几乎所有的数据库系统都提供了参数化SQL语句执行接口,使用此接口可以非常有效的防止SQL注入攻击。
2、对进入数据库的特殊字符(’”<>&*;等)进行转义处理,或编码转换。
3、确认每种数据的类型,比如数字型的数据就必须是数字,数据库中的存储字段必须对应为int型。
4、数据长度应该严格规定,能在一定程度上防止比较长的SQL注入语句无法正确执行。
5、网站每个数据层的编码统一,建议全部使用UTF-8编码,上下层编码不一致有可能导致一些过滤模型被绕过。
6、严格限制网站用户的数据库的操作权限,给此用户提供仅仅能够满足其工作的权限,从而最大限度的减少注入攻击对数据库的危害。
7、避免网站显示SQL错误信息,比如类型错误、字段不匹配等,防止攻击者利用这些错误信息进行一些判断。
4. 数据库中转义字符是什么意思
不是
以C语言为例,printf不是c语句,Printf是标准库里的函数。语言的语句用来向计算机系统发出操作指令。一个语句经编译后产生若干条机器指令。C语句都是用来完成一定操作任务的。printf命令的作用是格式化输出函数,一般用于向标准输出设备按规定格式输出信息。printf()函数的调用格式为:printf(“”,)。printf()是C语言标准库函数,在stdio.h中定义。输出的字符串除了可以使用字母、数字、空格和一些数字符号以外,还可以使用一些转义字符表示特殊的含义。
5. 数据库特殊字符转义
字符在传输的时候可能带有标点或特殊符号,此时必须要转义,否则就会报错。
6. sql语句指定转义字符
SQL SERVER中生成的语句中,字符串前加N。N 前缀必须是大写字母。是Unicode编码的意思,一般来说,英文字符是一个字节组成,但是国际上的字太多了,因此就用两个字节来表示字符,满足国际化的需要.在字符串前面加上 N 代表存入数据库时以 Unicode 格式存储。N'string' 表示string是个Unicode字符串Unicode 字符串的格式与普通字符串相似,但它前面有一个 N 标识符(N 代表 SQL-92 标准中的国际语言 (National Language))。N 前缀必须是大写字母。例如,'Michél' 是字符串常量而 N'Michél' 则是 Unicode 常量。Unicode 常量被解释为 Unicode 数据,并且不使用代码页进行计算。Unicode 常量确实有排序规则,主要用于控制比较和区分大小写。为 Unicode 常量指派当前数据库的默认排序规则,除非使用 COLLATE 子句为其指定了排序规则。Unicode 数据中的每个字符都使用两个字节进行存储,而字符数据中的每个字符则都使用一个字节进行存储。有关更多信息,请参见使用 Unicode 数据。Unicode 字符串常量支持增强的排序规则。select '''a''' --输出'a' 在sql语句中'用''来转义,其他字符可以直接输存储含有中文字符的最好有nvarchar存储只有英文、数字的最好用varchar1.有var前缀的,表示是实际存储空间是变长的,varchar,nvarchar 所谓定长就是长度固定的,当输入的数据长度没有达到指定的长度时将自动以英文空格在其后面填充,使长度达到相应的长度;而变长字符数据则不会以空格填充,比较例外的是,text存储的也是可变长。 2.有n前缀的,n表示Unicode字符,即所有字符都占两个字节,nchar,nvarchar 字符中,英文字符只需要一个字节存储就足够了,但汉字众多,需要两个字节存储,英文与汉字同时存在时容易造成混乱,Unicode字符集就是为了解决字符集这种不兼容的问题而产生的,它所有的字符都用两个字节表示,即英文字符也是用两个字节表示。 3.基于以上两点来看看字段容量 char,varchar 最多8000个英文,4000个汉字 nchar,nvarchar 可存储4000个字符,无论英文还是汉字 varchar与nvarchar的选择("n"前缀) 使用varchar存储含有非英文字符(比如中文,日文)时出现“??”的乱码 使用nvarchar的一个非常好处就是在判断字符串的时候可以不需要考虑中英文两种字符的差别. 当然,使用nvarchar存储英文字符会增大一倍的存储空间.但是在存储代价已经很低廉的情况下,优先考虑兼容性会给你带来更多好处的. 所以在Design的时候应该尽量使用nvarchar来存储数据.只有在你确保该字段不会保存中文的时候,才采用varchar来存储. SqlServer中nvarchar和varchar的区别 1、各自的定义:1.nvarchar(n) : 包含 n 个字符的可变长度 Unicode 字符数据。n 的值必须介于 1 与 4,000 之间。字节的存储大小是所输入字符个数的两倍。所输入的数据字符长度可以为零。 2.varchar[(n)]: 长度为 n 个字节的可变长度且非 Unicode 的字符数据。n 必须是一个介于 1 和 8,000 之间的数值。存储大小为输入数据的字节的实际长度,而不是 n 个字节。所输入的数据字符长度可以为零。2、区别:1.从存储方式上,nvarchar是按字符存储的,而 varchar是按字节存储的;2.从存储量上考虑, varchar比较节省空间,因为存储大小为字节的实际长度,而 nvarchar是双字节存储;3.在使用上,如果存储内容都是英文字符而没有汉字等其他语言符号,建议使用varchar;含有汉字的使用nvarchar,因为nvarchar是使用Unicode编码,即统一的字符编码标准,会减少乱码的出现几率;4.如果你做的项目可能涉及不同语言之间的转换,建议用nvarchar。
7. 数据库的转义字符
首先什么是转义字符,顾名思义转义字符最终是一种字符,只不过它是被转义了一下。所以它是一个字符的本质是不会变的。这也就是上面为什么说“这两种转移字符其代表着一个字节大小的整数值字符。”,因为字符是一个字节大小的。它是一个字符,但是由一个整数(三位八进制或两位十六进制)表示,正如ASCII码表中整数值48代表字符’0’一样。只不过’\000’代表整数0,其对应ASCII码表对应的字符为NULL。解释的有点拗口,但是大致的意思就是这样。
在C中有两种特殊的字符,八进制转义字符和十六进制转义字符,八进制字符的一般形式是'\ddd',d是0-9的数字。十六进制字符的一般形式是'\xhh',h是0-9或A-F内的一个。八进制字符和十六进制字符表示的是字符的ASCII码对应的数值。
八进制表示格式为/000,可以写三位数,每位数最大值为7,;十六进制数表示格式为/xhh,前面的x表示是十六进制,所以后面的两个h可以表示两位数,每位数最大值为f。
8. sql转字符集
由于mysql默认的字符集编码为latin ,而我们一般使用的是gbk 或者 gb2312编码所以不改过来容易造成乱码我用的是mysql 5.0 安装程序安装的 ,安装目录在C:\Program Files\MySQL\MySQL Server 5.0请到这个目录下面找到 my。ini文件修改default-character-set=latin1 为 default-character-set=gbk记住有两个地方啊 都要改最重要的一点就是修改文件前,先停止mysql服务 ,等修改后再重新启动使用dos命令 :net stop mysql 来停止服务 net start mysql 来启动然后在执行你的mysql脚本 ,一切ok! 这里你可以用discuz的sql做为例子运行!
9. sql转义字符
1、不要随意开启生产环境中Webserver的错误显示。2、永远不要信任来自用户端的变量输入,有固定格式的变量一定要严格检查对应的格式,没有固定格式的变量需要对引号等特殊字符进行必要的过滤转义。3、使用预编译(Prepare)绑定变量的SQL语句。4、做好数据库帐号权限管理。5、严格加密处理用户的机密信息。来自 「Web安全之SQL注入攻击技巧与防范
」。
10. 数据库查询转义字符的方法
XML实体中不允许出现"&","<",">"等特殊字符,否则XML语法检查时将出错,如果编写的XML文件必须包含这些字符,则必须分别写成"&","<",">"再写入文件中。
例如,如果在XML文档中使用类似"<"的字符,那么解析器将会出现错误,因为解析器会认为这是一个新元素的开始。所以不应该像下面那样书写代码:
[html]viewplaincopy<age>age<30</age>为了避免出现这种情况,必须将字符"<"转换成实体,像下面这样:<age>age<30</age>在读取的时候,解析器会自动将其转换回"&","<",">"等特殊字符,正常来说,只有"<"字符和"&"字符对于XML来说是严格禁止使用的。需要注意的是:
a.转义序列各字符间不能有空格;
b.转义序列必须以";"结束;
c.单独的&不被认为是转义开始;
d.区分大小写。以下是XML中需要的转义字符:&(逻辑与)&<(小于)<>(大于)>"(双引号)"'(单引号)'
- 相关评论
- 我要评论
-