提高postgresql安全性(三、转义符和SQL注入)

防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编码(如utf8)下才允许打开)。

但如果你为了保持兼容,执意要设置为on,请确保客户端字符环境不为gbk(如utf8)或者多测试一下你的转义程序,用最后编码为0x5c 的字符多测试一下。

除此外,有几个与backslash_quote 相关的参数:

1、standard_conforming_strings:默认为on:字符串中的反斜杆\ 不起转义作用。设为off, 或者在字符串前加个E, 如 E' ....\n ',将支持转义。

2、escape_string_warning:启用此选项后,如果反斜杠(\)以普通字符串文字('...' 语法)出现且standard_conforming_strings关闭则发出警告。默认值为on。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

trainee

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值