我有一个允许用户执行SQL脚本的程序。我有一个用户登录该程序,但即使是管理员用户,也有一个要求阻止执行。
我的意思是用户无法修改表等。通常我会建议所有用户连接都设置为只读,但程序中有一个元素需要能够执行INSERT。
我想检测用户可能执行的关键字,例如/ INSERT,UPDATE,ALTER,并希望某处有定义的列表。
答案 0 :(得分:4)
从您的问题中不清楚为什么您不仅仅使用权限:根据需要为用户提供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等做些什么。
权限(可能与存储过程一起使用)是真正的解决方案,因为您建议的替代方案是编写和维护的痛苦,并且几乎肯定会有漏洞。
答案 1 :(得分:2)
我认为你最好使用你希望允许用户做的事情的白名单,而不是试图将你不希望他们做的所有事情列入黑名单。
他们只允许运行SELECT吗?