1

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

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

4

1 回答 1

1

是的,您只能授予 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 脚本只能运行您希望允许它们运行的​​有限程序集。

于 2021-02-11T23:51:29.507 回答