为公众提供在数据库上运行SELECT查询的方法有多危险?

Ham*_*ite 5 mysql sql database security

假设我执行以下操作:

  • 我创建了一个MySQL数据库,并用一些数据填充它.
  • 我创建了一个只能访问该数据库的MySQL用户,并且只有SELECT权限.
  • 我创建了一个网页,用户(任何用户,无需密码)都可以通过该网页输入任意SQL,在提交表单时,脚本会尝试以我创建的MySQL用户身份运行SQL; 生成的任何结果集都显示给用户; 生成的任何错误消息都会显示给用户.
  • 假设数据库不包含存储过程等,只包含表和视图,我很高兴任何人都可以看到该特定数据库的任何内容.

我们假设设置将由恶意用户进行探测.可能发生的最坏情况是什么?

一些想法:

  • MySQL提供各种语句,如SHOW等,即使只有SELECT权限的用户也可以用来收集有关数据库服务器或我的数据库的信息.可以从错误消息中获取其他信息.虽然可能不足以获得不正当的访问权限,但这些信息肯定有助于这样做.
  • 数据库软件或我的脚本或脚本语言本身可能存在缺陷,这些缺陷可能允许访问者执行他们不应该通过此接口执行的操作.
  • 这样做可能违反服务协议条款,特别是如果我使用共享主机.

Boh*_*ian 6

嗯.聪明的用户可能会通过如下语法攻击:

select some_function_that_updates() from some_table;
Run Code Online (Sandbox Code Playgroud)

还有一种可能会破坏内存的拒绝服务攻击,例如:

select * from some_massive_table cross join some_other_massive_table;
Run Code Online (Sandbox Code Playgroud)

坦率地说,对于有经验的程序员来说,编写一个表现良好的查询是很困难的......即使他们试图编写一个好的查询,穷人也有什么机会


S.L*_*ott 5

为此,您必须编写一个实际执行查询的"shell"应用程序.你不会直接让人们在SQL服务器上松动.这很粗鲁.

MySQL提供各种语句,如SHOW等,即使只有SELECT权限的用户也可以用来收集有关数据库服务器或我的数据库的信息.

不要在shell中执行它们.

可以从错误消息中获取其他信息.虽然可能不足以获得不正当的访问权限,但这些信息肯定有助于这样做.

不要在shell中显示它们.

数据库软件或我的脚本或脚本语言本身可能存在缺陷,这些缺陷可能允许访问者执行他们不应该通过此接口执行的操作.

不要使用"提升"权限做任何事情.不要在shell中执行除SELECT之外的任何操作.

这样做可能违反服务协议条款,特别是如果我使用共享主机.

真的不太可能.和.不要问我们这类问题.我们不知道.阅读你的合同.


你忘了的事.

设计糟糕的SELECT * FROM table, table, table, table可以进行数十亿行的外连接,实际上成为拒绝服务攻击.

因此,您必须在操作系统和SQL Server中启用所有"资源配额"功能.每个配额必须设置得尽可能小,任何资源配额问题都会导致立即出现"太多数据"的错误页面.没有例外.没有解决方法.