注意,这纯粹是假设的;这个想法给了我heebie-jeebies。我宁愿拥有一个涵盖所有可能性的数据库管理UI。但我开始考虑是否有可能安全地做到这一点,并最终将自己绑在各种各样的结上。因此问题。
无论如何:假设我想允许我网站的某些用户通过输入“原始”SQL来搜索部分数据库:
所有表格都以与其相关的区域为前缀,例如videos_,photos_,forum_。我希望授予这些用户对某些部分的读访问权限,但不允许他们通过输入SQL直接修改数据,即使我相信他们通过UI进行更改。
我想要锁定这些可信赖的用户,比如所有的forum_ tables - 否则他们可以读取所有用户的私人消息,管理论坛帖子等等!
需要处理“可信用户”要求,他们必须在某个用户组中才能查看或使用此要求。它更像是“安全的SQL”部分。
是否只与仅具有读权限且仅在右表上的其他数据库用户连接一样简单?
或者我会黑名单(并拒绝SQL,如果它包含)forum_,DROP,ALTER,UPDATE,CREATE,INSERT等?
或者将SELECT,FROM,WHERE,相关的表名和字段名列入白名单?这听起来更安全,直到我想到WHERE field_name =“这里的任意文本”的需要。
还是某种组合? (比如说,记录使用“列入黑名单”的SQL,即使它已被阉割。)
还是跑掉了尖叫?
你会如何解决这个问题?实际上可以安全地做到这一点吗?
答案 0 :(得分:3)
如果您的目标最终用户对SQL感到满意,那么只要让他们访问客户端访问工具并通过他们对所述数据库的登录权限来限制他们可以做什么,就不会为自己节省大量时间。
答案 1 :(得分:3)
请不要尝试手动filter
错误的 SQL(关于insert
,delete
等字词......)。这听起来像是一个可怕的计划!
您的数据库应该为您提供经过测试的功能,以便为特定架构/表格上的特定用户/用户组授予或撤消读/写/更新/删除...权限......
答案 2 :(得分:1)
您应该(根据您的DBMS)能够限制用户可以使用权限直到对象级别的访问权限 - 如果您需要,甚至是列级别。
我建议使用白名单而不是黑名单方法,因为无论何时添加新对象(表格,视图等),默认情况下都是安全的 - 如果您忘记将对象设置为如果需要,列入黑名单。
答案 3 :(得分:1)
许多RDMS系统实现“模式”,(对于SQL Server)本质上是包含数据库对象的数据库中的容器(例如表 - 如果没有指定,则“dbo”是默认模式)。设置完成后,您可以为登录和所有包含的对象分配访问权限 - 因此,如果添加了表,他们将通过模式自动获取(或被拒绝)访问它。
缺点是你必须提前计划好。要将所有现有表移动到模式,现在需要重命名所有内容,并相应地更新所有现有代码。不过,如果你这样做,它将使设置和管理黑名单和/或白名单变得更加简单。
答案 4 :(得分:1)
白名单方法是一种方法。
您可以创建表的视图,拒绝基表的所有权限,并仅在视图上授予它们。通过这种方式,您可以控制谁,什么以及在哪里可以做(即拒绝插入,允许更新,但不在此处插入,完全隐藏此表等)
当我们讨论安全性时,这种方法有一个非常显着的优势 - 它完全隐藏了外部用户的数据库模式,减少了以后利用应用程序的可能性(是的,它确实以这种方式发生)。