HN công bố: Chạy JavaScript trong sandbox WebAssembly QuickJS
(github.com/sebastianwessel)QuickJS - Chạy JavaScript trong sandbox WebAssembly QuickJS
Gói TypeScript này cho phép chạy mã JavaScript an toàn bên trong sandbox WebAssembly bằng engine QuickJS. Nó phù hợp để cô lập và thực thi mã không đáng tin cậy một cách an toàn, đồng thời cung cấp môi trường thực thi mã vững chắc nhờ tận dụng engine QuickJS nhẹ và nhanh được biên dịch sang WebAssembly.
Tính năng
- Bảo mật: Có thể chạy mã JavaScript không đáng tin cậy trong môi trường an toàn và được cô lập
- Hệ thống tệp: Có thể mount hệ thống tệp ảo
- Module Node tùy chỉnh: Có thể mount các module Node tùy chỉnh
- Client Fetch: Có thể cung cấp client
fetchđể thực hiện các lệnh gọi http(s) - Test runner: Bao gồm test runner và
expectdựa trên chai - Hiệu năng: Có thể tận dụng ưu điểm của engine QuickJS nhẹ và hiệu quả
- Tính linh hoạt: Có thể dễ dàng tích hợp với các dự án TypeScript hiện có
- Đơn giản: Cung cấp API thân thiện để chạy và quản lý mã JavaScript trong sandbox
Xem toàn bộ tài liệu
Tìm ví dụ trong kho mã
Cách sử dụng cơ bản
Sau đây là một ví dụ đơn giản sử dụng gói này:
import { quickJS } from '@sebastianwessel/quickjs'
// Thiết lập chung như tải và khởi tạo QuickJS wasm
// Vì đây là tác vụ tốn tài nguyên nên nếu có thể chỉ nên thực hiện một lần
const { createRuntime } = await quickJS()
// Tạo một instance runtime mỗi khi chạy mã js
const { evalCode } = await createRuntime({
allowFetch: true, // tiêm fetch và cho phép mã lấy dữ liệu
allowFs: true, // mount hệ thống tệp ảo và cung cấp module node:fs
env: {
MY_ENV_VAR: 'env var value'
},
})
const result = await evalCode(`
import { join } as path from 'path'
const fn = async ()=>{
console.log(join('src','dist')) // ghi log "src/dist" trên hệ thống host
console.log(env.MY_ENV_VAR) // ghi log "env var value" trên hệ thống host
const url = new URL('https://example.com')
const f = await fetch(url)
return f.text()
}
export default await fn()
`)
console.log(result) // { ok: true, data: '<!doctype html>\n<html>\n[....]</html>\n' }
Ghi công
Thư viện này được xây dựng dựa trên:
- quickjs-emscripten
- quickjs-emscripten-sync
- memfs
- Chai
Công cụ được sử dụng:
- Bun
- Biome
- Hono
- poolifier-web-worker
- tshy
- autocannon
Giấy phép
Dự án này được phát hành theo giấy phép MIT.
Gói này đặc biệt phù hợp với các nhà phát triển muốn chạy mã JavaScript an toàn bên trong ứng dụng TypeScript, đồng thời đảm bảo hiệu năng và độ an toàn thông qua sandbox WebAssembly QuickJS.
Tóm tắt của GN⁺
Bài viết này giải thích cách sử dụng engine QuickJS để chạy mã JavaScript an toàn trong sandbox WebAssembly. Cách tiếp cận này rất hữu ích để cô lập và thực thi mã không đáng tin cậy. QuickJS mang lại hiệu năng nhanh dù nhẹ, đồng thời có ưu điểm là dễ tích hợp với các dự án TypeScript. Các dự án cung cấp chức năng tương tự bao gồm Deno và Node.js.
1 bình luận
Ý kiến Hacker News
Tác giả của thư viện quickjs-emscripten khen ngợi thư viện chuẩn của thư viện này
fetchvới cùng cookie như hàmfetchcủa máy chủỞ công ty trước, đã gặp nhiều "segmentation faults" và lỗi khi dùng quickjs-emscripten
Có nhiều cách để sandbox JavaScript
iframelà công nghệ duy nhất nhưng khá nặng và chậmHỏi liệu nó có chạy được trong trình duyệt hay không
Đã dùng thử quickjs nhưng cuối cùng chọn isolated-vm
Tác giả của một thư viện sandbox JS khác thấy cách tiếp cận của quickjs-emscripten khá thú vị
createRuntimecó thể định nghĩa các lời gọi tới môi trường máy chủ ngoàifetchhay khôngCho rằng thư viện này có thể dùng để chạy mã JS do người dùng cung cấp
Nhắc rằng hiệu năng của QuickJS không thể cạnh tranh với JS VM của máy chủ
Đã từng làm một wrapper cấp cao cho quickjs-emscripten
require()rất khóThư viện quickjs-emscripten-sync cung cấp đồng bộ tự động giữa hàm máy chủ và hàm khách, điều này có thể tạo ra bề mặt tấn công lớn
Hỏi liệu vì được biên dịch sang wasm nên nó có thể chạy trong trình duyệt hay không