将命令限制为仅在 MySQL / MariaDB 中的过程

Restricting commands to procedure only in MySQL / MariaDB

我使用大量 public 代码组装了一个 FiveM 服务器,发现存在允许用户破坏或删除底层数据库的作弊系统。原因是因为他们可以注入 Lua 包含 DROP、DELETE INSERT 和 UPDATE 的脚本,如果他们知道模式可能会做任何他们喜欢的事情。

我的意图是拒绝访问除 SELECT 之外的所有命令,并将所有其他逻辑移至存储过程。问题是执行 proc 的用户将是游戏用户帐户,如果被锁定也会被服务器端阻止?我是否能够拒绝调用应用程序的访问但允许从存储过程中进行访问,或者让过程作为与正常 SELECT 语句不同的帐户执行?还有其他可行的考虑或设计吗?我将在所有调用中使用参数来帮助防止注入,但我对 MySQL 还很陌生,所以想知道人们在这些情况下还采取了哪些其他步骤。

是的,您可以授予 MySQL 用户仅调用过程的权限。然后过程以定义过程的用户的权限执行。

阅读 https://dev.mysql.com/doc/refman/8.0/en/create-procedure.html 关于 SQL SECURITY 的部分,其中有选项 DEFINERINVOKER。默认是DEFINER,这是你想要的。

但是,您还需要拒绝应用程序用户的 SELECT 权限。恶意用户除了 SELECT 权限外什么都不会引起问题。他们不能更改数据,但他们可以使数据库服务器超载。

因此您需要在存储过程集合中实现每个 数据库查询,包括读取和写入。

这里有一个替代建议:允许应用程序像现在一样工作,应用程序使用其用户名连接并直接进行 SQL 查询。

但是如果用户想要调用他们的 Lua 脚本,只允许在单独的数据库连接上使用具有有限权限的不同 MySQL 用户。基本上只有特定模式的 EXECUTE 权限。您可以实现 Lua 脚本允许 运行 的一组存储过程,并将它们放入该模式中。然后 Lua 脚本无法执行应用程序执行的其他任务,Lua 脚本只能 运行 您希望允许它们执行的有限过程集 运行.