首页 时政热点 科技头条 智能AI 安全攻防 数码硬件 开发者生态 归档 标签 关于

Show HN:SafeScript,用于执行不受信任代码的 JavaScript 安全版本

摘要

JSON for code. A safe computational subset of JavaScript. JSON gave the world a safe way to exchange data. SafeScript does the same for computation. It's a strict subset of JavaScript — no eval , no n...

SafeScript safe run and return JSON the await for that
2026-11-09 1 阅读 约8分钟阅读 EGreg
分享:
字号:
JSON 代码。 JavaScript 的安全计算子集。 JSON 为世界提供了一种安全的数据交换方式。 SafeScript 对计算执行相同的操作。它是 JavaScript 的一个严格子集——没有 eval 、没有 new 、没有全局变量、没有原型访问——可以编译为纯 JS 和 PHP。打开 .safe 文件,您会看到可以安全运行的代码。编译器压缩后约为 48 KB(gzip 压缩后约为 12 KB)。将其运送到任何地方,在本地进行验证,无需信任。 SafeScript 从小处开始,就像 JSON 一样。任何需要数据或事件安全处理程序的地方: Web 服务器处理程序 — 路由逻辑、请求转换、用户或租户提交的验证规则 onclick 和事件处理程序 — 用户编写的浏览器事件处理程序,无法逃脱其沙箱 插件脚本 — 使用用户提交的逻辑扩展应用程序,而不会给主机带来风险 公式和表达式 — 电子表格样式的计算字段、定价规则、评分函数 机器人和代理工具 — 用于构建安全的 AI 代理的可调用工具(请参阅安全机器人) 使用逻辑进行配置— 当 JSON 不够,而任意 JS 太多时 // Node.js const SafeScript = require ( 'safescript' ) ; const 结果 = 等待 SafeScript 。运行('返回x + y;',{x:10,y:20}); // → 30 // 默认情况下,安全全局变量可用 - 无需注入等待 SafeScript 。 run('返回Math.floor(3.7);'); // → 3 等待 SafeScript 。 run('返回 JSON.parse("{}");') ; // → {}(空原型,剥离 __proto__)await SafeScript 。 run('返回Object.keys({a:1});'); // → ['a'] // Math.random 默认情况下是确定性的(mulberry32 PRNG,种子 0)await SafeScript 。 run('返回Math.random();'); // → 每次都使用相同的值 < script src =" safescript.min.js "> < script > SafeScript 。运行('返回n * 2;',{n:21})。 then ( 函数 ( 结果 ) { // → 42 } ) ; SafeScript 文件使用 .safe 扩展名和 application/safescript MIME 类型。 .safe 文件是独立的 - 它在顶部声明了它需要什么功能,并且主机提供了它们。 /** * @safescript 0.2 * @needs request: 请求 * @needs db: 数据库 * @uses logger: 记录器 * @env 浏览器,节点 */ var body = request . json();如果(记录器)记录器。 log('已收到',正文);返回数据库。存储(主体);标头是可选的 /** */ 块注释,包含五个指令: @safescript — 语言版本 @needs : — 所需的功能;主机必须提供它或拒绝运行文件 @uses : — 可选功能;主机提供它(如果可用),脚本会检查 if (name) @type { method1, method2 } — 声明返回类型以及脚本打算调用的方法 @env , — 限制哪些环境可以运行此文件(可选,逗号分隔) @type 声明告诉主机脚本打算调用返回类型上的哪些方法。它们纯粹是声明性的——它们不会改变运行时的执行,但它们在 load() 时启用飞行前验证。 /** * @safescript 0.2 * @needs fetch: 函数 * @needs log: 函数 * @type Response { json, text, status } * @type Stream { get, set, fields } */ var resp = fetch ( '/api/data' ) ; var data = resp . json();日志(数据);当 load() 处理此标头时,它会检查: 每个 @type 名称都已向主机注册(通过 SafeScript.lib() ) 每个声明的方法都在主机的 allowedMethods 白名单中 这会尽早捕获不匹配(在脚本运行之前),而不是在第一次方法调用时失败。如果脚本声明 @type Response { json, text, status } 但主机只允许 json 和 text ,则 load() 会立即抛出异常。 .safe 文件作为信任单元 .safe 文件是一个信任单元 — 一组声明,一个沙箱边界。有关其安全状况的所有内容都在单个文件中可见: 它需要什么 (@needs) — 注入的功能 它可选使用什么 (@uses) — 可降级功能 它涉及哪些返回类型 (@type) — 主机提供的对象上的方法 它期望什么环境 (@env) — 运行时约束 如果您想要两个具有不同访问模式的函数,请将它们放在两个 .safe 文件中。每个文件都有自己的作用域、自己的类型声明和自己的沙箱。文件是安全边界。这是设计使然。 SafeScript 保护主机的环境 — 它确保用户提交的代码只能调用主机明确允许的代码。用户保护(确保主机按照用户的利益行事)来自完全不同的层 - 关于主机的证明,而不是 SafeScript 中的约束。请参阅 Safebots 层了解这些层的组成方式。 .safe 文件声明它需要什么。它不导入、要求或获取任何东西。主机读取声明并构建范围——主机在哪里获取实现是它的事。节点主机可能会从 node_modules 解析它们。浏览器主机可能使用导入映射或 CDN。沙盒环境可能来自策划的白名单。这 。
这篇文章对您有帮助吗?

订阅66必读

每日精选科技资讯,直达你的邮箱