问题描述
我有一个基于 PHP Laravel 的系统,在某些方面,它允许管理员用户将原始 PHP 代码写入 HTML 文本区域,以便仅针对其客户端版本的系统执行自定义逻辑。
提交带有代码的表单后,我检查代码是否存在语法错误,并通过 try-catch 块和数据库事务运行一次,该事务会自动回滚以测试任何明显错误,而无需实际修改数据库。
一旦用户的代码得到验证,我就会将其粘贴到 Web 服务器上新文件中的函数调用中,然后系统会根据需要包含和调用该文件以运行自定义逻辑。
因为每个客户端都有自己的数据库架构,所以我不担心模型调用可能无法完全完成他们打算对数据库执行的操作。但我担心的是管理员编写恶意代码(有意或无意),允许他们访问网络服务器上的文件系统,只有我们在 AWS 中控制,并对其进行黑客攻击/造成损害。
因此,我想阻止正在编写自定义代码的管理员执行诸如使用 include
、file_get_contents
、mkdir
函数、shell_exec
功能等
这样做的最佳方法是什么?有没有办法在运行管理员的自定义代码时暂时禁用任何潜在危险的函数调用/指令,然后在他们的自定义代码完成后重新启用所有这些?如果可能的话,我什至如何才能获得我需要暂时关闭的所有事情的明确列表,以便没有一些随机功能等。我不知道客户端能够用来破解我们的系统?谢谢。
编辑 #1:我发现这篇与我的问题相关的优秀 SO 帖子:Exploitable PHP functions
它似乎包含我正在寻找的确切列表,但后来我看到了一些类似以下帖子的答案:https://stackoverflow.com/a/3732621/1992973
然后我想,“我应该如何防范这种情况?”但后来我看到了这个答案:https://stackoverflow.com/a/3119902/1992973
而且我想也许我可以在 disable_functions
中使用 PHP.ini
指令来完全禁用这些功能,这样即使有人使用巧妙的变量等试图破解系统,{ {1}} 文件会阻止它们。
当然,这会遇到一个问题,作为系统开发人员,有时我想使用 PHP.ini
之类的功能,而禁用它也会阻止我。
我在想我可以使用类似 file_get_contents
的东西来临时设置禁用的函数来执行用户脚本,然后在用户脚本执行完成后重新设置。有什么想法吗?谢谢。
此外,上述策略是否也能保护我免受 ini_set
、eval
、echo
之类的伤害?谢谢。
编辑 #2:经过反复试验,我了解到在运行时无法通过 exit
等动态修改 disable_functions
。
我开始认为我唯一能做的就是通过检查所有错误的函数名称来清理提交的用户代码,并且不允许这样的事情:
ini_set
如果有人有更好的想法,请分享。谢谢。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)