如何使用PHP的用户LUA脚本安全

时间:2018-03-31 21:17:16

标签: php oop lua

我想在PHP中制作一些涉及脚本的游戏。出于显而易见的原因,我不希望玩家/用户使用我只是includeeval的PHP。所以我决定和LUA一起去。

但我从来没有在PHP中尝试过LUA。所以我的问题是:

  1. 允许用户LUA脚本(开箱即用)PHP是一个安全的解决方案吗?
  2. 如果没有,那我可以(以及如何)使其安全吗?
  3. 我的目标:

    • 用户使用一些通用的根函数编写一些代码,让我们说main()
      • PHP代码调用该函数并评估结果
    • LUA代码应该能够在某个对象上调用选择少数方法。例如,来自课程Enemy::isNear()Enemy::getHP()
      • LUA代码不应该能够调用其他方法/访问其他对象/调用任何全局php函数/访问任何不安全的操作系统内容

    同样,我很久以前只是抓过LUA,因为C中的游戏允许使用LUA mods。根本没有使用PHP的LUA经验。

1 个答案:

答案 0 :(得分:0)

如果您正在谈论thissource code表示它只是像C嵌入一样创建标准的lua实例。它似乎没有定义任何lua-to-host接口,所以,lua代码没有直接访问php状态。

要让用户致电Enemy::isNear(),您必须先将Enemy置于lua状态。它似乎能够半智能地将php对象转换为lua表(lua.c第386行),我不确定方法字段是否会传输良好。在最坏的情况下,你需要自己执行实现对象包装(编写一个lua“类”,其构造函数接受一个php对象并在其上打一个metatable)。似乎有一种方法可以将php函数传递给lua。

Lua不应该访问任何你没有放入的php内容。还有危险的lua函数:requiredofileloadloadstring,在lua的环境中loadfile和库osdebug。 您可以通过输入以下代码段来检查lua函数的可用内容:

for k in pairs(_ENV) do print(k) end

为了确保你也可以投入这一行:

if not (_G==_ENV) then for k in pairs(_G) do print(k) end end 

从此时开始,继续进行lua manual on scoping以及有关沙盒lua的其他讨论(例如this。Google也会查找其他结果)。您也可以阅读lua closures,这样就不会意外地将不良方法加入到upvalues中。

最后,代码while true do end中有无限循环。如果您的沙箱没有处理(很可能),您将不得不从外部处理。可能像this