面对PostgreSQL不安全的一些大胆宣传(同时欢呼MySQL的安全性)我想得到别人的意见:
我已经说过PostgreSQL比MySQL更具安全意识(支持角色,更多身份验证方法......),但数据库本身对应用程序的安全性影响非常有限。或者我在这里忽略了任何争论?
[1] Is MySQL more resistant to SQL injection attack than PostgreSQL (under Perl/DBI)?
PS:MySQL和PostgreSQL都是很棒的产品 - 不需要任何与安全无关的讨论; - )
答案 0 :(得分:10)
“默认情况下,PostgreSQL可能是 最安全的数据库 可用......“
由于多查询语句,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)的补充,我会添加几件事:
DROP table foo;
指令。答案 3 :(得分:1)
将此作为评论放在这里不是一个好地方:
多选是一种类似的查询:
mysql_query("SELECT x FROM y; SELECT p FROM q;");
两个单独的查询,一个查询调用。这是经典的SQL注入场景,其中用户提供的数据执行与编码器有意的完全不同的查询,例如, Bobby Tables攻击。
只有凭借MySQL的驱动程序不允许这样的结构,MySQL / PHP才能免于此。它仍然完全容易受到子查询注入的影响,但它不会在同一语句中允许两个完全独立的查询。答案 4 :(得分:0)
默认的PostgreSQL安装会阻止通过pg_hba.conf文件以非常严格的方式访问数据库。系统管理员应该如何将数据库暴露给外部世界。配置完成后,由应用程序来防止数据库“攻击”。