是否可以通过SQL SELECT语句更改数据库?

时间:2014-05-20 08:28:38

标签: sql postgresql sql-injection

我们希望允许管理员(仅)通过Web UI执行SQL SELECT语句。 请注意,管理员可以查看数据库中的所有信息。

这种方法有哪些安全风险? 是否可以通过SQL SELECT语句(任何记录或表)以某种方式更改数据库?

加入

RDBMS是PostgreSQL

1 个答案:

答案 0 :(得分:2)

  

我们希望允许管理员(仅)通过Web UI执行SQL SELECT语句。请注意,管理员可以查看数据库中的所有信息。

     

这种方法有哪些安全风险?是否可以通过SQL SELECT语句(任何记录或表)以某种方式更改数据库?

那么,您如何建议让他们执行SELECT语句? PostgreSQL没有用户级语句权限,它对单个数据库对象具有权限。

理论上,您绝对可以使用SELECT修改数据库。只需看看PostgreSQL的功能列表。更不用说用户定义的功能了。最明显的情况当然是nextval,它会推进序列,或setval来设置序列的位置。

但是,所有内容都需要关联数据库对象的权限。如果您只在表上GRANT SELECT权限(或列表的某个子集),则用户将无法直接修改该表中的数据。 PostgreSQL也没有提供绕过内置限制的功能。因此,简单地创建一个只对某些表具有SELECT权限且对其所在模式具有USAGE权限的用户应该没问题。

但有一些重要的警告。 SECURITY DEFINER用户定义的函数可以执行定义用户可以执行的任何操作,因此,如果您使用SECURITY DEFINER用户定义的函数未经过仔细编写,则可能会打开安全漏洞。用C语言编写的用户定义函数也是如此 - 请仔细考虑您的扩展。最后,你需要非常小心用“不受信任的”语言编写的任何函数,比如plpython,plperl等(而不是沙盒的plperlu),因为必须仔细实现这些函数以确保调用用户不能欺骗它们做他们不应该做的事。

如果您打算让用户直接访问编写原始SQL,则必须更加小心保护数据库。默认情况下,GRANTpublic对{}}}的权限不具有REVOKE权限。检查security definer个函数以确保它们已定义SET search_path个选项。等等。它通常是安全的,但只有在你小心的时候。