MySQL将用户分开读取,写入和管理

时间:2016-10-30 23:29:37

标签: mysql sql

几年前我参加了一个MySQL课程,教师让我们创建了对表有不同权限的独立用户,作为针对SQL注入等攻击的最后一道防线。用户基本上会这样创建:

CREATE USER 'read'@'localhost' IDENTIFIED BY 'password';
GRANT SELECT ON * TO 'read'@'localhost';

CREATE USER 'write'@'localhost' IDENTIFIED BY 'password';
GRANT SELECT, INSERT, UPDATE, DELETE ON * TO 'write'@'localhost';

CREATE USER 'admin'@'localhost' IDENTIFIED BY 'password';
GRANT ALL ON * TO 'admin'@'localhost';

然后根据应用程序对数据库执行的操作,您将使用具有足够访问权限的凭据。我最近正在考虑实施这个,并试图看看这是什么最好的做法,但我找不到任何东西。

这方面有最佳做法吗?这是人们真正做的事吗?准备和消毒的陈述是否过度杀伤?

1 个答案:

答案 0 :(得分:1)

我认为这本身并不是最好的做法。当然,拥有正确的权限绝对是最佳实践。并且,对只读应用程序具有只读访问权限是很好的。

防止注入的最简单方法是使用参数化查询。这是你的第一道防线。如果您的所有查询都是select个查询,那么以具有只读访问权限的用户身份进行连接就是一个胜利。

但是,如果您也在修改数据库,则不起作用。而是包装在存储过程中进行更改的代码。这些可以在不同的安全上下文中运行。这允许应用程序具有读取权限和执行权限,但不具有数据修改权限。

直接使用存储过程而不是insert / update / delete语句还有其他优点。例如:您可以记录操作,可以运行其他逻辑,可以同时修改多个表,可以从应用程序中隐藏事务。