Chinaunix首页 | 论坛 | 博客
  • 博客访问: 205250
  • 博文数量: 21
  • 博客积分: 1546
  • 博客等级: 上尉
  • 技术积分: 290
  • 用 户 组: 普通用户
  • 注册时间: 2006-10-10 14:54
文章分类

全部博文(21)

文章存档

2020年(1)

2019年(3)

2015年(2)

2014年(1)

2011年(1)

2009年(7)

2008年(4)

2007年(2)

我的朋友

分类: Mysql/postgreSQL

2019-10-23 15:24:02

防SQL注入一直是程序员要注意的安全问题。Postgresql有个重要的设置请不要随意更改,除非你有确定的把握。

backslash_quote: 字符表达式中是否允许 \' 存在。在SQL标准中,转义字符串中的'是转义为''(两个单引号),可是很多客户端软件都转义为\'(反斜杆+单引号),为了兼容,若将backslash_quote设为on,将允许\'存在,但对某些客户端编码是不安全的,其中就包括我们gbk编码,因为汉字gbk编码有些字符的末位在数值上等同于\(值为0x5c),某些客户端软件会将这些字符转义错误,导致出现不应该出现的\'而被SQL注入。

举个例子:客户端字符环境为gbk,某个版本的php,字符串转义函数pg_escape_string,PHP手册说建议用此函数替代 。 

点击(此处)折叠或打开

  1. header("Content-Type:text/html;charset=gbk"); // gbk编码
  2. pg_escape_string("a'b"); // 结果是 a''b , 将一个单引号转义为2个单引号,符合SQL标准
  3. pg_escape_string("診"); // 结果是 診\ ,診的最后gbk编码为0x5c,和反斜杆一样,结果转义后多了个反斜杆
  4. 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
阅读(6029) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~