创建一个安全的 Lua 沙箱..?

2023-12-02

现在我正在做很多事情。

local env = {
    print = print,
}

setfenv(函数,环境) 然后使用元方法来锁定实例上的属性,但它确实效率低下并且有很多绕过。我用谷歌搜索了它,我发现的一切都与此相同:不起作用。


在 Lua 5.1 中,沙箱非常简单。如果某个文件中有一个 Lua 脚本,并且您想阻止它访问除您提供的参数之外的任何函数或任何内容,您可以这样做:

local script = --Load the script via whatever means. DO NOT RUN IT YET!
setfenv(script, {})

script现在已沙盒化。除了您直接提供的值之外,它无法访问任何其他内容。它创建的函数无法访问此沙箱环境之外的任何内容。你原来的全球环境与它们完全隔绝,除非你允许它访问。

显然,您可以在该表中放置任何您喜欢的内容;该表将包含您喜欢的任何全局可访问的内容。你或许应该让 Lua 脚本访问基本的 Lua 标准库函数;其中大部分都是纯函数,不能做任何令人不快的事情。

这是您可以使用的 Lua 标准库内容的列表must not如果您想保持沙箱的完整性,请授予用户访问权限:

  • getfenv。用户有充分的理由能够setfenv,这样它就可以在您的沙箱中创建自己的迷你沙箱。但是,如果您想维护沙箱的完整性,则不能允许访问您放入沙箱中的任何函数的环境。
  • getmetatable:与上面的推理相同;设置元表就可以了。虽然恶意代码如果更改其元表就可以破坏对象,但恶意代码只需执行无限循环就可以破坏整个系统。
  • The entire debug图书馆。通过调试库可以进行各种欺骗。

您显然还需要解决Lua 5.1 在从 Lua 脚本中加载字节码时存在这个问题。这可以用来破坏沙箱。不幸的是,Lua 5.1 并没有真正为此提供好的工具。在Lua 5.2+中,可以封装load and loadfile,这样无论用户提供什么,您都可以在内部传递“t”作为模式参数。但是对于Lua 5.1,你需要一些方法来封装load等人。这样您就可以辨别数据何时是文本,何时不是。通过阅读 Lua 源代码,您可能会找到 Lua 用于区分字节码和文本的代码。

或者你可以直接禁止load和它的朋友们。

如果你想阻止用户对系统做一些丑陋的事情,那么就禁止os and io图书馆。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

创建一个安全的 Lua 沙箱..? 的相关文章

  • 访问 Lua 类型元表

    显然 getmetatable 可以访问几种类型的元表 getmetatable getmetatable getmetatable newproxy true 然而 似乎您无法获取其他类型的元表 除了函数 似乎无法访问数字 布尔值或 ni
  • 为什么这个 Lua 优化 hack 会提高性能?

    我正在寻找一个描述提高 Lua 性能的各种技术的文档 http www lua org gems sample pdf脚本代码 我很震惊竟然需要这样的技巧 虽然我引用的是 Lua 但我在 Javascript 中也见过类似的 hack 为什
  • 迭代包括空行在内的行

    给定一个带有一些空行的多行字符串 我如何在Lua中迭代行包括空行 local s foo nbar n njim for line in magiclines s do print line and blank or line end gt
  • 如何使用循环将字符串连接成一个?

    有人可以帮我解决字符串连接问题吗 我从寄存器读取数据 它的函数 utf regAddr length 我得到带有十进制数字的表格 然后将其转换为十六进制并循环字符串 我需要将这些字符串连接成一个 Lua中没有像 这样的操作符 functio
  • 使用 OOP 的闭包方法时如何实现受保护的成员?

    现在我正在使用实施 OOP 的闭包 http lua users org wiki ObjectOrientationClosureApproach在卢阿 下面是一个简短的示例 我的问题发生在尝试实施时stronger heal insid
  • 使用 EVAL、SCAN 和 DEL 的 Redis 通配符删除脚本返回“非确定性命令后不允许写入命令”

    因此 我正在寻求构建一个 lua 脚本 该脚本使用 SCAN 根据模式查找键并删除它们 原子地 我首先准备了以下脚本 local keys local done false local cursor 0 repeat local resul
  • 创建独立的 Lua 可执行文件

    有没有一种简单的方法可以从 Lua 脚本创建独立的 exe 文件 基本上这将涉及链接 Lua 解释器和脚本 我相信这是可能的 PLT 方案允许以相同的方式创建独立的可执行文件 但是到底是如何实现的呢 查看srlua http www tec
  • Corona/Box2D 检测与非移动静态物体的碰撞

    出于发帖原因 这是我正在尝试做的事情的简单版本 在屏幕上我有一个简单的圆形对象 它是静态的并且不会移动 然后用户可以拖放一条直线 如果该线穿过该圆圈 我希望触发碰撞事件 看来除非其中一个物体正在移动 否则永远不会检测到碰撞 绘制线条时能否检
  • 十六进制常数 = 格式错误的数字?

    我有一个 Lua 脚本 我试图在其中使用十六进制数字 0x 如果我使用官方 Windows 二进制文件在控制台中运行此脚本 它可以正常工作 但是如果我在我的应用程序中运行它 简单的 dofile 我得到 malformed number n
  • 什么更快?循环或多个 if 条件

    我想知道什么更快 是只用一条指令 即 1 1 执行 9 次 for 循环还是执行 9 个 if 条件时 我认为 if 更快 因为您不需要检查循环中的指令 它应该几乎相同 因为for循环本质上是检查if条件为真并运行一段代码 非常类似于if声
  • 如何解密Lua字节码?

    早上好 我正在尝试破译 Moon 字节码 但我无法以任何方式 有人可以帮助我吗 我有这个 例如 code 27 76 117 97 81 0 1 4 4 4 8 0 如何将此字节码解密为文本 我已经在这里搜索 http www asciit
  • Redis 排序集和解决关系

    我正在使用 Redis 排序集来存储我正在处理的项目的排名 我们没有预料到 我们想要如何处理关系 Redis 按字典顺序对具有相同分数的条目进行排序 但我们想要做的是对具有相同分数的所有条目给予相同的排名 例如在以下情况 redis 127
  • 用于嵌入式服务器的 Web 技术

    我最近开始了一个针对嵌入式设备的新 Web 开发项目 并希望征求一些有关使用技术的建议 该设备将提供 HTML 页面 其中包括用于从 JSON 服务器检索数据的 AJAX 代码 我们暂时使用 Cherokee 作为 Web 服务器 但我们并
  • Redis INCRBY 有限制

    我想知道是否有一种方法可以通过我的应用程序的单次往返在 Redis 中执行此操作 对于给定的键K 其可能值V是范围内的任意整数 A B 基本上 它有上限和下限 When an INCRBY or DECRBY发出命令 例如INCRBY ke
  • 为什么 LuaJIT 这么好?

    编辑 不幸的是 LuaJIT 已从下面链接的比较中删除 This 比较 http shootout alioth debian org u64 which programming languages are fastest php编程语言的
  • 获取沙箱用户的 App Store 收据失败,并显示密码错误消息

    我在 Mac App Store 中分发了一个商业 macOS 应用程序 现在 在启动时 我会检查 App Store 收据 如果不存在 则以代码 173 退出 这将打开 App Store 登录对话框以获取收据 我一直使用沙盒帐户对此进行
  • Lua中按字符分割字符串

    我有像这样的字符串 ABC DEF 我需要将它们分开 字符并将两个部分分别分配给一个变量 在 Ruby 中 我会这样做 a b ABC DEF split 显然Lua没有这么简单的方法 经过一番挖掘后 我找不到一种简短的方法来实现我所追求的
  • 比较 Lua 中的日期

    我有一个带有日期表的变量 如下所示 table day number 15 year number 2015 month number 2 如何获取当前日期与上述日期之间的天数 非常感谢 您可以使用os time 将表转换为秒并获取当前时间
  • 如何在 emacs lua-mode 中配置缩进?

    完整的 emacs 新手在这里 我在 Ubuntu 上使用 emacs 23 1 1emacs 入门套件 https github com technomancy emacs starter kit 我主要在 lua 模式下工作 安装了pa
  • 为沙盒 Cocoa 应用程序创建临时文件

    我的应用程序是沙箱化的 根据最新的应用程序商店指南 我想创建一些临时文件 我可以这样做吗 如果 是 我可以在哪里这样做 有没有预先指定的路径 还有访问该路径的命令 您应该使用NSTemporaryDirectory 函数 它将查找并返回适合

随机推荐

  • UUID 之间没有连字符

    受到这里给出的建议的启发 JPA 实体类给出 2 个 GenerateValue 字段的错误 我的问题与此相反 如何生成没有破折号的uuid 我正在使用 H2 DB 并在我的模型中有这个 Id GeneratedValue strategy
  • 如何从 UIBezierPath 生成 CGPoint-Array(沿给定路径触摸滑动对象)[重复]

    这个问题在这里已经有答案了 我有一个 UIBezierPath 像 8 一样弯曲 其中只有 4 个点 我需要用它制作某种 CGPoint 数组 有任何想法吗 谢谢 edit 我的贝塞尔曲线是这样初始化的 void initBezier th
  • PySide 的 QTest 未选中复选框

    这是我的代码 from PySide import QtCore QtGui QtTest import sys application QtGui QApplication sys argv checkbox QtGui QCheckBo
  • Android SDK:媒体播放器 - 从 HTTP url 加载视频流

    我有一个带有以下代码的 MediaPlayerActivity 此代码基本上尝试从 http url 获取视频流并加载它 但由于某种原因它不断崩溃 public class MediaPlayerActivity extends Activ
  • 在 Django 中包含 css

    我是 Django 新手 我很难在模板中包含 css 样式 I read this并尝试做同样的事情 但它对我不起作用 我的模板 load static 我得到的 HTML 请注意 这是包含我的 css 的文件夹 谢谢 鲍里斯 确保你没有
  • 如何使用 form_validation 和 CodeIgniter 设置自定义错误消息

    我是 CodeIgniter 的新手 我正在尝试对数组输入进行表单验证 数组名称是pages 我写道 this gt form validation gt set rules pages required 如果我用那个 this gt fo
  • 创建反应应用程序错误

    我想使用 create react app 所以我按照说明操作 npm install g create react app create react app my app cd my app npm start 但我在最后一步出错了 运行
  • 是否可以以编程方式在网页全屏模式下禁用 esc/F11 键? [复制]

    这个问题在这里已经有答案了 是否可以以编程方式在网页全屏模式下禁用 esc F11 键 我需要在网页中有一个退出按钮来退出全屏模式 但需要防止使用 Windows 的其他功能 如 esc F11 等 退出全屏模式 如果有人对此有任何想法 请
  • 当宽度不同时CSS倒梯形

    我需要制作下面的形状 其中将包含一些文本 有时文本会更长 有时会更短 因此我可以使用任何固定宽度 这是我的代码 我想知道是否有一种方法可以将图像标记到跨度的开头和结尾 高度不会改变 因此就跨浏览器解决方案而言 这可能是最好的 div cla
  • 我的Java版本是最新版本但我的JVM仍然是1.5?

    最近我尝试使用Eclipse但是当我打开它时 它告诉我我的 JVM 版本太旧 Incompatible JVM Version 1 5 0 05 of the JVM is not suitable for this product br
  • Xamarin Forms - 应用程序打开时禁用自动锁定

    我想在我的应用程序打开时禁用自动锁定 我怎样才能做到这一点 https learn microsoft com en my xamarin essentials device display tabs android 只需要设置Device
  • 如何组织或排序 std::vector

    我有一个充满 cv Point 的向量 我想组织这个向量 以便具有最小 x 和 y 值的点应该是第一个 最后一个应该具有最高的 x y 值 任何想法我该怎么做 Use std sort std sort vec begin vec end
  • 缩放和旋转 模板匹配

    我正在使用匹配模板的方法CV TM CCORR NORMED比较两个图像 我想让这个旋转和比例不变 有什么想法吗 我尝试对图像和模板的傅里叶变换使用相同的方法 但旋转后的结果仍然不同 模板匹配matchTemplate当您的对象在场景中旋转
  • Angularjs 需要星号

    我有一个大表单的指令 其中一些字段是必需的 一些字段不是必需的 必填字段标有required属性 我想在所有输入之前加上 span class something span 基本上是这样的 input required prepend sp
  • Git安装脚本如何输入shell命令

    这更多是一个与 git 相关的问题 而不是与 openshift 相关的问题 当我使用 git 将文件推送到 git 服务器时 我看到我的 perl 的文件权限index cgi在我的 openshift 存储库中 文件更改为 700 因此
  • matplotlib 在子图中创建断轴

    我有一个有问题的子图 它有两个数据比例 我不想使用对数刻度 而是想打破轴 以便子图 y 轴的一半从 0 到 10 另一半从 10 到 100 import numpy as np import matplotlib pyplot as pl
  • Selenium/Webscrape 该字段

    我的代码运行良好并打印所有行的标题但带有下拉菜单的行 例如 如果单击第 4 行 则会出现一个下拉列表 我实现了一个try理论上这会启动下拉菜单 然后拉出标题 但是 当我执行 click 并尝试打印时 对于具有这些下拉列表的行 它们不会打印
  • 如何在 Fortran 中的 do 循环中跳过一些迭代

    例如 我想以 2 的增量从 1 循环到 500 但是 对于每 8 个循环 我想跳过接下来的 18 个循环 使 do 变量增加 18 我怎么做 我的代码是 event 0 do i 1 500 2 event event 1 if event
  • 为什么总是调用超类构造函数[重复]

    这个问题在这里已经有答案了 我有以下2个课程 public class classA classA System out println A class classB extends classA classB System out pri
  • 创建一个安全的 Lua 沙箱..?

    现在我正在做很多事情 local env print print setfenv 函数 环境 然后使用元方法来锁定实例上的属性 但它确实效率低下并且有很多绕过 我用谷歌搜索了它 我发现的一切都与此相同 不起作用 在 Lua 5 1 中 沙箱