防SQL注入一直是程序员要注意的安全问题。Postgresql有个重要的设置请不要随意更改,除非你有确定的把握。
backslash_quote: 字符表达式中是否允许 \' 存在。在SQL标准中,转义字符串中的'是转义为''(两个单引号),可是很多客户端软件都转义为\'(反斜杆+单引号),为了兼容,若将backslash_quote设为on,将允许\'存在,但对某些客户端编码是不安全的,其中就包括我们gbk编码,因为汉字gbk编码有些字符的末位在数值上等同于\(值为0x5c),某些客户端软件会将这些字符转义错误,导致出现不应该出现的\'而被SQL注入。
举个例子:客户端字符环境为gbk,某个版本的php,字符串转义函数pg_escape_string,PHP手册说建议用此函数替代 。
-
header("Content-Type:text/html;charset=gbk"); // gbk编码
-
pg_escape_string("a'b"); // 结果是 a''b , 将一个单引号转义为2个单引号,符合SQL标准
-
pg_escape_string("診"); // 结果是 診\ ,診的最后gbk编码为0x5c,和反斜杆一样,结果转义后多了个反斜杆
-
pg_escape_string("診'"); //结果是 診\'' ,多了个'没被转义,漏洞产生
至于是哪个版本的php和如何SQL注入,这里不便多说。
因此,考虑到某些客户端的漏洞暂时无法解决的情况下,postgresql的backslash_quote设置就起最后一道防线,干脆不允许\'的存在,将
backslash_quote设为 off或safe-encode(默认:在
安全的client_encoding编码(如utf8)下才允许打开)。
但如果你为了保持兼容,执意要设置为on,请确保客户端字符环境
不为gbk, 或者多测试一下你的转义程序,用最后编码为
0x5c 的字符多测试一下。
除此外,有几个与
backslash_quote 相关的参数:
1、standard_conforming_strings:默认为on:字符串中的反斜杆\ 不起转义作用。设为off, 或者在字符串前加个E, 如 E' ....\n ',将支持转义。
2、escape_string_warning:启用此选项后,如果反斜杠(\)以普通字符串文字('...' 语法)出现且standard_conforming_strings关闭则发出警告。默认值为on。
阅读(6165) | 评论(0) | 转发(0) |