【问题标题】:Is there a list of SQL execution keywords eg. INSERT, ALTER是否有 SQL 执行关键字的列表,例如。插入,改变
【发布时间】:2012-02-14 10:59:08
【问题描述】:

我有一个允许用户执行 SQL 脚本的程序。我有一个用户登录到该程序,但要求防止任何执行,即使它是管理员用户。

我的意思是用户不能修改表等。通常我会建议将所有用户连接设置为只读,但程序中有一个元素需要能够执行 INSERT。

我想检测用户可能执行的关键字,例如/INSERT、UPDATE、ALTER,并希望在某处有一个已定义的列表。

【问题讨论】:

  • Oracle 应该如何知道用户想要执行哪些语句?
  • 我不应该阻止用户编写 DROP TABLE 或 INSERT 或 ALTER 或 EXEC
  • UPDATE、DELETE、CREATE 和 TRUNCATE 怎么样?
  • 这不是角色的用途吗?为什么你试图通过解析用户 SQL 来控制它?也许我误会你了
  • 使登录“用户定义的脚本”通过与应用程序逻辑使用的登录分开执行。然后,应用程序可以使用 StoredProcs 和/或其他控制机制来允许/禁止适当的访问。 “用户定义脚本”登录可以有不同的访问级别,尤其是只读的。

标签: sql sql-server database oracle


【解决方案1】:

从您的问题中不清楚为什么您不只为此使用权限:根据需要授予用户 SELECT 和/或 INSERT 权限。如果更适合您的需要,您还可以将关键操作包装在存储过程中,并仅在过程上授予 EXECUTE。

解析实际的 SQL 很困难,因为您不能只搜索某些单词,还必须建立它们的上下文。以“删除”为例:

-- I guess you don't want this
delete from dbo.SomeTable
-- but maybe you do want this?
select * from dbo.SomeTable where Status = 'deleted'

恶意(或只是好奇)用户肯定会很高兴测试您的解析代码的限制,看看他们可以用 EXEC、sp_executesql、OPENQUERY 等做什么。

权限(可能与存储过程一起使用)是这里真正的解决方案,因为您建议的替代方案编写和维护起来会很痛苦,而且几乎肯定会有漏洞。

【讨论】:

  • 这应该是公认的答案。比让用户即时编写 SQL 代码更安全、更理智。
【解决方案2】:

我认为你最好将你希望允许用户做的事情列入白名单,而不是试图将你不希望他们做的所有事情列入黑名单。

他们是否只允许运行 SELECT?

【讨论】:

  • 这个怎么样:SELECT * INTO T1 FROM T;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多