我有一个允许用户执行 SQL 脚本的程序。我有一个用户登录到该程序,但要求阻止任何执行,即使它是管理员用户也是如此。
我的意思是用户不能修改表等。通常我建议将所有用户连接设置为只读,但程序中有一个元素需要能够执行 INSERT。
我想检测用户可能执行的关键字,例如/INSERT、UPDATE、ALTER,并希望某处有定义的列表。
最佳答案
从您的问题中不清楚您为什么不为此使用权限:根据需要向用户授予 SELECT 和/或 INSERT 权限。您还可以将关键操作包装在存储过程中,并仅对这些过程授予 EXECUTE,如果这更适合您的需要的话。
解析实际的 SQL 很困难,因为您不能只搜索某些词,还必须建立它们的上下文。以 'DELETE' 为例:
-- 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 - 是否有 SQL 执行关键字列表,例如。插入、修改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9275692/