对于Web应用程序,在创建将连接到MySQL数据库的用户时,您可以选择权限。假设该用户打算执行的唯一操作是SELECT / INSERT / UPDATE / DELETE,那么只提供这些权限似乎是有意义的,但是我从未在任何地方看到过推荐 - 这是什么原因支持和反对方法
答案 0 :(得分:23)
我在这里不同意比尔,Atomix的思路更合适。除非能够以其他方式证明,否则Bill的回答会大大增加数据库受到威胁的风险。
也许对于非常有经验的开发人员来说,还有其他安全措施,但是对于其他开发人员来说,如果没有必要,给数据库提供一个完整的,不受约束的访问来做任何事情,就会遇到麻烦。
这里应该使用最小特权原则。对于MySQL,拥有一个具有所有权限的超级用户,用于创建表,删除数据库等。理想情况下,在任何PHP文件或Web服务器上的任何文件中都不会看到此用户名和密码。 (我使用PHP作为示例,但它适用于其他Web应用程序)。您只能将此用户名和密码与PHPMyAdmin或MySQL Workbench一起使用。
然后,对于PHP脚本,有一个具有最低要求的脚本,例如INSERT,SELECT,UPDATE,甚至可能不是DELETE,具体取决于您的PHP脚本。这将是在PHP文件中,也就是说,实际上只有文档根目录的一个文件,这是大多数人推荐的。
原因是:是的,每个Web应用程序用户都不需要MySQL用户。但是应该适用最小特权原则(http://en.wikipedia.org/wiki/Principle_of_least_privilege)。如果您的MySQL超级用户因为意外地将您的MySQL连接脚本命名为.txt而不是.php,或者有人获得了对Web服务器文件的访问权,那么他们可以做的最糟糕的事情就是SELECT,UPDATE和INSERT。 ..无论如何,虽然可能会造成大问题,但并不像给DROP DATABASE,DROP TABLES和更糟糕的事情那样糟糕。
此外,在我目前的项目中,由于敏捷开发实践(我不推荐http://www.agilealliance.org/),一两个“非技术”团队成员直接使用PHPMyAdmin直接更改MySQL数据库。这是因为不需要创建用于简单直接数据输入的CMS。在这种情况下,第三个具有合理但又“恰好”特权的MySQL用户适合他们。我们不希望以极少的权限削弱团队成员,但当然他们不应该意外删除或更改内容。
由于MySQL没有ROLES(截至原始问题的时候,并且根据Bill),因此允许任何Web脚本只使用一个超级用户访问MySQL是非常危险的。
答案 1 :(得分:7)
在普通应用程序中,用户可能还需要其他权限,例如:
还有可能 minimal 特权只能表示某些表上的SELECT,而只能表示其他表上的SELECT和UPDATE等。这可能会随着应用程序功能的增强而改变。并且有一些奇怪的情况,例如需要对您永远不会查询的表具有SELECT权限,因为它是由您更新的表中的外键引用的。因此,跟踪最小特权是一种巨大的痛苦。
您尝试使用SQL权限进行限制?您是编写所有代码的人,因此不需要以精细的粒度管理SQL权限。坦率地说,如果您的用户能够上传和运行您未经过审查的SQL语句,那么您就会遇到更大的问题:
SELECT * FROM mytable, mytable, mytable, mytable, mytable ORDER BY 1;
您要管理的实际任务不在数据库级别,而是在应用程序业务级别。例如,CMS具有创建页面,编辑页面,管理注释等操作。这些任务比SQL权限更高级别。您可以使用SQL角色(它们是特权组)来模仿它们,但SQL角色不受广泛支持。
我不知道有谁将他们的应用程序用户映射到不同的MySQL用户。他们是您在应用程序中进行身份验证的用户,在应用程序已连接到数据库之后(用户只是数据库中的数据行)。
因此,您可能最好让您的网络应用程序使用具有完全权限的单个MySQL用户。
答案 2 :(得分:3)
Web应用程序通常只使用一个用户来访问数据库,而不是每个实际用户帐户的用户。应用最小特权是很好的做法。用户名和密码将被编码到您的脚本中(有没有人对此进行模糊处理?)因此,如果您的脚本管理不当,则存在妥协的余地。
根据我的经验,我非常非常少地让应用程序删除行 - 更好的方法是将行标记为已删除,然后审核其中的内容而不是不知道有什么内容!此方法还有助于保持表和索引的优化。
因此,我建议只允许INSERT,UPDATE和SELECT - 如果您的应用程序的某些部分需要放宽一点,它会很快变得明显!
允许更多权限只能通过发布资源密集型命令或允许恶意数据攻击来扩大DoS攻击的可能性。