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

Posted

技术标签:

【中文标题】仅在 MySQL / MariaDB 中将命令限制为过程【英文标题】:Restricting commands to procedure only in MySQL / MariaDB 【发布时间】:2021-05-15 17:44:05 【问题描述】:

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

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

【问题讨论】:

【参考方案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 脚本只能运行您希望允许它们运行的​​有限程序集。

【讨论】:

谢谢。可能让我们崩溃的用户 lua 脚本是恶意注入的,整个角色扮演框架从 lua 运行 mysql 命令。我在想我需要一种方法来知道哪些电话可能是“已知和信任的”电话。我想我可以制作一个 FiveM 代理资源,我可以将所有命令从解决方案移动到其中。默认的 mysql-async 资源可以保留在访问受限的连接上调用任何内容,但新资源中的受信任命令将在另一个连接上运行。 嗯,这可能是一个教育机会。您认为允许客户端上传代码功能然后在您的服务器上逐字运行它们是一种好的软件设计吗? 没有。我确实清楚地说“恶意注入”。我们不会让人们通过设计来运行自己的东西。我什至在我最初的问题中说“存在允许用户破坏或删除底层数据库的作弊系统”,这又不是我们的意图,而是我们试图防范的事情。 我们的服务器上有一个反作弊系统,可以防止攻击,但它并不是 100% 完美的。我们不是故意允许这样做的,但我们昨晚发现有人使用强大的作弊系统,他们有能力注入自己的资源并运行他们喜欢的任何 SQL 语句。与其纯粹依赖反作弊,我想调查我们是否可以通过构建一些保护技术来加强内部代码以抵御攻击,以应对它们可能漏掉的边缘情况。 我们不顺便写游戏客户端,只写后端服务器自定义。我们受到游戏客户端漏洞的摆布。

以上是关于仅在 MySQL / MariaDB 中将命令限制为过程的主要内容,如果未能解决你的问题,请参考以下文章

如何仅在所有平台的离子中将应用程序限制为纵向模式?

一次仅在一个子记录中将位字段限制为真

如何在 MySQL/MariaDB 中将 LONGTEXT 字段作为 JSON 返回

仅在我的 iOS 应用程序中将 tesseract 字符限制为 a-z 和数字

超出 MariaDB/MySQL 资源限制

MariaDB 在一个命令中将所有表的 row_format 设置为动态