8.1.4 等安全发布常见问题解答
问:发布了什么?
答:PostgreSQL 小版本 8.1.4、8.0.8、7.4.13 和 7.3.15。所有这些版本都实现了安全补丁,消除了针对 SQL 注入攻击的特定漏洞。
问:此漏洞影响谁?
答:从互联网或其他方式暴露于“不可信输入”的 PostgreSQL 服务器用户,以及使用任何“多字节编码”,例如 UTF-8 或 SJIS 的用户。基本上,大多数具有 Web 应用程序的开源数据库用户。
问:谁不受影响?
答:几种类型的应用程序
1. 数据库应用程序未暴露于不可信输入的用户,例如未暴露于互联网的单用户应用程序。
2. 在客户端和服务器上都设置了“LATIN-1”或其他单字节编码的数据库。
3. 如果应用程序始终将不可信字符串作为行外参数发送,而不是将它们嵌入到 SQL 命令中,则它不会受到攻击。这仅在 PostgreSQL 7.4 或更高版本中可用。
问:是否有任何人特别危险?
答:使用远东编码(SJIS、BIG5、GBK、GB18030 和 UHC)的应用程序,这些应用程序使用临时方法来“转义”进入数据库的字符串,例如正则表达式或 PHP3 的 addslashes() 和 magic_quotes。由于这些方法绕过了数据库特定的代码来安全处理字符串,因此许多此类应用程序需要重写才能变得安全。(请注意,PHP 团队在版本 4.0 中弃用了 addslashes() 和 magic_quotes,因为存在安全风险。不幸的是,它仍然出现在网上大量免费 PHP 应用程序中。)
问:更新何时可用?
答:源代码包现已可用,以及 Windows、Red Hat Linux 和其他几个操作系统的二进制包。大多数编程语言的 PostgreSQL 驱动程序更新将在星期三之前提供,其他更新将在不到一周的时间内提供。
问:用户应该怎么做?
答:三个步骤
1. 阅读有关新补丁的完整发行说明;
2. 更新其数据库服务器及其数据库驱动程序;
3. 从其应用程序中删除所有非标准字符串转义机制,例如流行的“反斜杠转义”或“\’” ,或者至少修改它们以使用 SQL 标准加倍()来转义引号。
问:哎哟!步骤#3 看起来很痛苦。我真的需要重构我的应用程序吗?
答:只有在使用远东多字节编码(SJIS、BIG5、GBK、GB18030 和 UHC)的情况下才需要。如果您使用的是 UTF-8,则应用新版本的 PostgreSQL 就足够了。当然,您应该计划在您方便的时候迁移您的应用程序以使用正确的转义函数,这样当 PostgreSQL 转换为 SQL 标准字符串(没有反斜杠转义)时它就不会中断。SQL 标准字符串很快就会成为默认值,可能在 PostgreSQL 8.3 中就会成为默认值。
问:我还能做些什么来阻止 SQL 注入攻击?
答:除了这些更新之外,还有很多步骤可以用来阻止 SQL 注入攻击,这些是安全意识强的应用程序开发人员应该采取的措施
1. 采用良好的数据库安全设计,在该设计中,将限制性数据库权限分配给公共数据库角色。
2. 使用参数化准备语句来执行查询(例如“SELECT * FROM table WHERE id = ?”)(请注意,PHP 在 v5.1 之前没有对该功能提供适当的支持)
3. 使用存储过程从 Web 应用程序执行查询,而不是将它们直接发送到数据库。
4. 对数据库中的有价值数据进行哈希或加密。
问:如果我使用的是 PostgreSQL 7.2 或 7.1 该怎么办?
答:那么您应该在两年前就升级了。PostgreSQL 7.2 自 2004 年以来一直处于维护期。请尽快升级到更新版本。
问:为什么您发布了一个会破坏我的应用程序的安全更新?
答:相信我们,我们尽力避免这种情况。六位 PostgreSQL 程序员花了四个星期的时间寻找一种方法来修复漏洞,而不会影响生产应用程序。这是我们能做的最好的事情——它让大多数用户的应用程序不受影响。
问:如果我的应用程序没有暴露在互联网上,我想升级但禁用转义更改怎么办?
答:在 postgresql.conf 中设置“backslash_quote = on”。并计划在更方便的时候保护您的应用程序。
问:您说 PHP 黑客不应该使用 addslashes() 或 magic_quotes_gpc。他们应该使用什么?
答:以下任何一种
1. pg_escape_string()(但很快就会找到驱动程序更新)
2. PEAR-DB(针对此漏洞安全,但可能会受到未来问题的攻击,因为它使用临时转义)
3. 不是 PEAR-MDB2(根据 PEAR 开发团队的说法,MDB2 目前正在使用一个自定义的转义例程,该例程目前不安全。预计下周会更新。)
4. PDO
5. 如果您使用的是 magic_quotes_gpc,请使用 magic_quotes_sybase 进行测试(并计划重构——magic_quotes 将不会出现在 PHP 6.0 中)