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

我想在PHP中制作一些涉及脚本的游戏。由于明显的原因,我不希望玩家/用户使用我includeeval的PHP。因此,我决定使用LUA。

但我从未在PHP中尝试使用LUA。所以我的问题是:

  1. 允许在(out of the box) PHP中使用用户LUA脚本是否安全?
  2. 如果不安全,我可以(如何)使其更安全吗?

我的目标是:

  • 用户编写一些代码,使用一些通用的根函数,比如main()
    • PHP代码调用该函数并评估结果
  • LUA代码应该能够在某些对象上调用几个特定的方法。例如从类Enemy::isNear()Enemy::getHP()
    • LUA代码不应该能够调用其他方法/访问其他对象/调用任何全局php函数/访问任何不安全的操作系统内容

再次说明,我只是很久以前接触LUA,当时C中的游戏允许LUA模块。对在PHP中使用LUA没有任何经验。

点赞
用户4687565
用户4687565

如果你谈论的是 这个源代码表明它只是创建了标准的 lua 实例,就像 C 嵌入一样。它似乎根本没有定义 lua 到宿主的接口,因此 lua 代码不能直接访问 php 状态。

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

Lua 不应该访问任何你没有放入的 php 东西。仍然存在危险的 lua 函数:requiredofileloadloadstringloadfile 和 lua 环境中的库 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手册](https://www.lua.org/pil/14.html)和其他有关限制lua脚本的讨论(例如[这个](https://stackoverflow.com/questions/1224708/how-can-i-create-a-secure-lua-sandbox))。你可能还需要阅读有关lua 闭包,以避免意外把不需要的方法放在upvalue中。

最后,代码中有无尽的循环 while true do end。如果你的沙盒没有处理好(很可能是这样),你将需要外部处理。可能像这样

2018-04-01 13:53:53