阿里云函数计算JS后端沙盒

本文纯属实验性质,如果有误请各位大佬指正。因使用本文所述的方法和技术所产生的安全风险,本文作者概不负责。

与上一篇介绍的前端沙盒相比,后端沙盒更加复杂而困难,安全风险也更高。当我们需要在服务端执行不受信任的动态代码时,往往我们需要限制代码对各种后端核心资源的访问权限,也需要限制执行代码的时间和空间。传统的方法通常是使用docker等隔离容器执行不受信任的代码,例如算法竞赛在线测评等,以此来实现对计算资源的精确控制和度量。

在本文中,我们介绍一种基于阿里云函数计算的JS后端沙盒。相比于传统的容器沙盒,函数计算沙盒更加简单容易,对于使用阿里云服务的应用平台也更加契合。

云函数

在阿里云函数计算服务中,创建一个新的服务和新的函数,选择基于事件的函数,不配置任何权限,不设置任何触发器

这样,当前函数就不具有阿里云账户的任何权限,在其中也无法访问任何受保护的资源。因为没有触发器,所以此函数仅可通过SDK触发,我们就可以在上层应用中控制执行。

您还可以通过配置函数的超时时间和内存大小来限制函数的执行能力。安全起见,请不要配置并发。

沙盒代码

在新创建的函数中写入以下代码:

const AsyncFunction = (async function () {}).constructor

exports.handler = async (event, context, callback) => {try {const payload = JSON.parse(event.toString())if (!payload.code) throw 'No Code'const f = new AsyncFunction('ctx', payload.code)const res = await f(payload.ctx)callback(null, { ok: 1, res })} catch (e) { callback(null, { ok: 0, err: e.toString() }) }
} 

此事件函数接受一个JSON字符串,描述一个执行请求,包含一个代码字符串event.code和一个可以在代码中使用的参数对象event.ctx。通过创建AsyncFunction的方式实现动态代码执行,代码中可以使用await

调用执行

使用阿里云函数计算官方SDK github.com/aliyun/fc-n…

npm i @alicloud/fc2 

在代码中,使用阿里云的账户密钥调用函数,并传入事件参数:

const FCClient = require('@alicloud/fc2')

const client = new FCClient('<account id>', {accessKeyID: '<access key id>',accessKeySecret: '<access key secret>',region: 'cn-shanghai'
})

// call function
resp = await client.invokeFunction(serviceName, funcName, JSON.stringify({code: 'return ctx.a + ctx.b',ctx: { a: 1, b: 2 }
})) 
```### 如何入门网络安全

#### 建议

多看书

阅读永远是最有效的方法,尽管书籍并不一定是最好的入门方式,但书籍的理解需要一定的基础;但是就目前来看,书籍是比较靠谱的入门资料。

现在Web安全书籍比较多,因此大家在学习的过程中可以少走了不少的弯路。如果以上推荐书籍阅读有困难,那就找自己能看得进的 Web 安全的书

当然纸上谈兵终觉浅,最好还是实践一下。

对于那些没有学习方向和资料的同学,可以看下我整理的资源,这份资料经历过社会的实践,可以说是当下全网较全的网络安全知识体系:
①网络安全学习路线
②20份渗透测试电子书
③安全攻防357页笔记
④50份安全攻防面试指南
⑤安全红队渗透工具包
⑥网络安全必备书籍
⑦100个漏洞实战案例
⑧安全大厂内部视频资源
⑨历年CTF夺旗赛题解析

![在这里插入图片描述](https://img-blog.csdnimg.cn/bb231f9ba2ae4c538a62e1158a615d63.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/64ee2a70c4a84257acbf9bfd55f914ef.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/3896070a7676429aa4796b68caed2b66.png)

<img src="https://hnxx.oss-cn-shanghai.aliyuncs.com/official/1673601460401.png?t=0.5084107994384632" style="margin: auto" />
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JavaScript 中,可以使用 `Function` 函数来进行沙盒化处理。具体来说,可以通过以下步骤来实现: 1. 创建一个空对象 `sandbox` 作为沙盒。 2. 在 `sandbox` 中定义可供执行的函数和变量,这些函数和变量只能在沙盒中被访问和修改,不会影响到全局作用域。 3. 使用 `Function` 函数创建一个新的函数对象,并将要执行的代码作为参数传递给它。这个函数对象只能访问沙盒中定义的函数和变量,不能访问全局作用域中的函数和变量。 4. 调用这个函数对象来执行代码。 下面是一个使用 `Function` 函数进行沙盒化处理的示例: ```javascript // 创建一个空对象作为沙盒 var sandbox = {}; // 在沙盒中定义一个变量和一个函数 sandbox.data = 10; sandbox.add = function(a, b) { return a + b; }; // 使用 Function 函数创建一个新的函数对象 var func = new Function('sandbox', 'return sandbox.add(sandbox.data, 20);'); // 调用这个函数对象来执行代码 var result = func(sandbox); // 输出结果 console.log(result); // 30 ``` 在上面的示例中,我们首先创建了一个空对象 `sandbox` 作为沙盒。然后,在沙盒中定义了一个变量 `data` 和一个函数 `add`。接着,使用 `Function` 函数创建了一个新的函数对象 `func`,将要执行的代码作为参数传递给它。这个代码中调用了沙盒中的函数和变量,不能访问全局作用域中的函数和变量。最后,调用这个函数对象来执行代码,并将沙盒作为参数传递给它。 需要注意的是,使用 `Function` 函数进行沙盒化处理的时候,需要对要执行的代码进行充分的检查和过滤,以避免恶意代码的注入。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值