-1

我有一个接口,我希望允许输入任意 SQL 选择语句(作为输入字符串),该语句将从给定表中选择数据以用于操作。我想确保此语句不会更改数据库。

string query = GetStringFromForm(...);

DatabaseStatement statement(query);

statement.execute();

while (statement.fetch(...))
    ...

实现这一点的一种方法是创建一个具有适当权限的新数据库用户,然后在该用户下执行语句。这会很麻烦,因为它需要设置这个新用户并为其创建一个新的数据库连接等等。

有没有办法隔离单个语句 MySQL 5.5 的权限?或者其他方式来做到这一点?

4

2 回答 2

1

不要为所有内容使用相同的登录名连接到数据库。

至少你应该为这个架构使用你的登录名:

  1. 用于创建表等的开发级登录
  2. 您的应用程序用于使应用程序运行的登录名
  3. 用于执行用户指定查询的登录名

这意味着您的应用程序登录只有它需要的权限——读取或写入必要的表,而不是对每个表执行所有操作;例如,应用程序登录不需要能够创建或删除表。

这限制了代码错误的影响,但也限制了某人可以入侵您的系统的范围(例如 SQL 注入攻击)

这也意味着运行用户特定查询的登录只需要被授予 SELECT 权限,并且只需要它应该能够使用的表/视图/函数。如果他们尝试运行他们没有权限的 INSERT 或 DELETE,您可以捕获错误并告诉用户他们是very naughty boy安全的,RDBMS 根本不会让用户损坏任何东西你还没有允许他们这样做。


简而言之,RDBMS 已经有了登录权限架构。使用它们来限制代码不同方面的权限和功能。

我不会尝试重新发明这个轮子。极有可能是您错过了某个技巧或黑客攻击,从而暴露了您的应用程序中的漏洞我很欣赏你说这很麻烦,但这确实是正确的做事方式,也是唯一可靠的做事方式。抱歉,这是数据安全的标准方法是有原因的。

(相信我,即使没有人试图破解你的系统,最终还是会有人输入一些古怪的查询——不小心绕过了你的安全性,让你的数据库大吃一惊。)

于 2012-11-19T12:03:38.343 回答
1

使用 MySQL 5.6,您可以:

START TRANSACTION READ ONLY;

https://dev.mysql.com/doc/refman/5.6/en/commit.html

我想这就是你要找的东西,但你必须升级到 5.6 才能使用它。

于 2012-11-19T13:28:06.563 回答