防SQL注入一直是程序员要注意的安全问题。Postgresql有个重要的设置请不要随意更改,除非你有确定的把握。
backslash_quote:
字符表达式中是否允许 \' 存在。在SQL标准中,转义字符串中的'是转义为''(两个单引号),可是很多客户端软件都转义为\'(反斜杆+单引号),为了兼容,若将backslash_quote设为on,将允许\'存在,但对某些客户端编码是不安全的,其中就包括我们gbk编码,因为汉字gbk编码有些字符的末位在数值上等同于\(值为0x5c),某些客户端软件会将这些字符转义错误,导致出现不应该出现的\'而被SQL注入。
举个例子:客户端字符环境为gbk,某个版本的php,字符串转义函数pg_escape_string(PHP手册说建议用此pg专用转义函数替代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编码(