PostgreSQL的安全性与MySQL等相比

时间:2011-06-25 01:34:53

标签: mysql security postgresql sql-injection

面对PostgreSQL不安全的一些大胆宣传(同时欢呼MySQL的安全性)我想得到别人的意见:

  • "由于多重选择,PostgreSQL不安全。 - 我假设`multiselects`是我所谓的'subselects`,但我可能错了。当前的MySQL版本支持子选择,但根据[1],某些库可能不支持或可能已禁用它们。这可能是索赔的原因还是我在这里忽略了什么?
  • " SQL注入是最容易利用PostgreSQL" - IMHO SQL注入是一个应用程序/库问题,只是有效的SQL查询,因此数据库之间没有真正的区别,对吧?!
  • "我喜欢PostgreSQL获取root权限,因为它有很多安全漏洞" - 首先我假设PostgreSQL的安全跟踪记录和MySQL一样好(在这方面真的找不到多少)?其次以root身份运行PostgreSQL只是一个愚蠢的想法。或者有什么有效的吗?

我已经说过PostgreSQL比MySQL更具安全意识(支持角色,更多身份验证方法......),但数据库本身对应用程序的安全性影响非常有限。或者我在这里忽略了任何争论?

[1] Is MySQL more resistant to SQL injection attack than PostgreSQL (under Perl/DBI)?

PS:MySQL和PostgreSQL都是很棒的产品 - 不需要任何与安全无关的讨论; - )

5 个答案:

答案 0 :(得分:10)

  

“默认情况下,PostgreSQL可能是   最安全的数据库   可用......“

     

Database Hacker's Handbook

由于多查询语句,PostgreSQL并不是不安全的,这是正常的功能,但在较旧的MySQL驱动程序中不可用。 MySQLi驱动程序还支持多查询语句。 SQL Server,Oracle,DB2和几乎所有其他数据库都有这个选项,MySQL实现它的时间很晚。迟到,并不意味着“安全”。

SQL注入是程序员的一个主要错误,而不是数据库。键盘背后的主要问题是,应该责怪。

使用预准备语句和STOP信任用户输入,这就是如何避免SQL注入和其他安全问题。存储过程也可以帮助降低SQL注入的影响,这些在PostgreSQL中使用起来非常方便。如果SQL中有动态表或列名,请同时检查quote_ident()。 MySQL缺乏这样的功能。

PostgreSQL具有ROLES和继承角色来设置和维护权限。如果您向所有人赠送超级用户权限(root),则会产生问题。如果你不这样做,那你就安全了。超级用户权限中没有已知的错误,这些权限中关于安全漏洞的声明听起来像FUD,因为没有证据。

您检查过SE PostgreSQL了吗?这是更高层次的安全性。 PostgreSQL版本9.1(此时的测试版)也为SE提供了新选项。 MySQL只能梦想这种安全级别。

答案 1 :(得分:5)

我个人认为,使用不同数据库技术的安全辩论通常是完全没有根据的,在许多情况下,那些快速指出其中一个或那个的人很可能没有意识到数据泄漏的原因并非如此。因为数据库,但因为他们没有正确保护他们的应用程序,但不能承认错误,因此将责任推到别处。至少这是迄今为止我对任何数据库技术的所有安全性辩论。

一个很好的例子,SQL注入根本不是数据库错误。 SQL是一种标准化语言,MySQL和PostgreSQL(以及Oracle和其他人......)都接受它。 SQL注入是对结构化查询语言的操纵,而不是服务器安全漏洞。应用程序没有正确清理输入的事实是它的原因。您不能争辩说使用相同标准化语言的一个数据库对于意外查询操作的安全性要低于使用相同技术的另一个数据库,因此无论谁告诉您SQL注入对这两个数据库之一的问题更明显不明白SQL注入到底是什么。

关于以root身份运行PostgreSQL,您不应该以root身份运行。作为root用户在服务器上运行服务总是一个坏主意,同样,与服务器无关。

我对PostgreSQL的经验很少,但我会说MySQL有一个出色的权限系统,允许用户在选择列表客户端主机上的特定数据库列表上委派一组可用命令。 PostgreSQL可能与此不同,但我很难接受与身份验证相关的安全性,而用户帐户与另一个相比是跳跃式的。

答案 2 :(得分:2)

作为斯科特答案(+1)的补充,我会添加几件事:

  • 使用MySQL无法使用子查询进行SQL注入,但您可以使用 UNION查询进行SQL注入,但需要更长时间,但就信息泄露而言,UNION注入是必须的。 SQL注入通常用于信息泄露,而不仅仅用于注入DROP table foo;指令。
  • PostgreSQL disalow基础间查询,除非您使用dbi_connect特殊行为。因此,在数据库分离方面,它会更好。
  • PostgreSQL有一个很大的用户/组权限管理,您可以为每个用户或组的所有对象和数据提供非常精细的SQL策略。我会说它甚至比MySQL中的更好(但我可能错了)。在数据库连接用户凭据管理方面,您有一个非常大的工具,例如,您可以在外部SSO系统上映射数据库用户。
  • 然后,这对我来说是重要的一点。在安全性方面,拥有安全且强大的数据库的一种方法是限制应用程序入口点并管理数据库中的数据完整性和繁重的数据操作。如果将应用程序入口点限制为某些存储过程和视图,某些存储语句,然后在其他一些存储过程中执行重要操作。触发器,或者如果您只向用户显示视图,并使用规则来执行真正的写入作业等。看看我的意思?那么构建这种应用程序PostgreSQl实际上是两者中最好的。

答案 3 :(得分:1)

将此作为评论放在这里不是一个好地方:

多选是一种类似的查询:

mysql_query("SELECT x FROM y; SELECT p FROM q;");

两个单独的查询,一个查询调用。这是经典的SQL注入场景,其中用户提供的数据执行与编码器有意的完全不同的查询,例如, Bobby Tables攻击。

只有凭借MySQL的驱动程序不允许这样的结构,MySQL / PHP才能免于此。它仍然完全容易受到子查询注入的影响,但它不会在同一语句中允许两个完全独立的查询。

答案 4 :(得分:0)

默认的PostgreSQL安装会阻止通过pg_hba.conf文件以非常严格的方式访问数据库。系统管理员应该如何将数据库暴露给外部世界。配置完成后,由应用程序来防止数据库“攻击”。