介绍
Deno 是一个基于 V8 引擎的新型 JavaScript 运行环境。它由 Node.js 的创始人发起,旨在提供更好的安全性和开发体验。Deno 运行时使用 Rust 编写,在实现安全性方面的功能上做了很多工作。
在这篇文章中,我们将探讨 Deno 运行环境的安全性问题,以及如何借助其安全特性确保代码不会被攻击者利用,同时还会探讨其中的一些陷阱和注意事项。
安全特性
默认不允许访问本地文件系统
Deno 运行环境默认不允许访问本地文件系统,因此,尝试访问系统中的任何文件或目录时,都会引发一个权限错误。只有当我们使用 --allow-read 或者 --allow-write 标记启动运行程序时,Deno 才会允许我们访问本地文件系统。
// 读取本地文件 const data = await Deno.readFile("./file.txt"); console.log(data); // 写入本地文件 const encoder = new TextEncoder(); const data = encoder.encode("Hello Deno"); await Deno.writeFile("./file.txt", data);
默认不允许访问网络
Deno 运行环境默认不允许访问网络。只有在使用 --allow-net 标记启动程序时,Deno 才会允许访问 URL,发送 HTTP 请求,和创建 WebSocket 连接。
// 发送 HTTP 请求 const response = await fetch("https://example.com"); console.log(await response.text()); // 创建 WebSocket 连接 const socket = new WebSocket("ws://localhost:8080"); console.log("WebSocket opened");
默认不允许访问环境变量
Deno 运行环境默认不允许访问环境变量,不支持从环境变量中读取敏感信息。只有在使用 --allow-env 标记启动程序时,Deno 才会允许访问环境变量。
// 获取环境变量 const env = Deno.env.toObject(); console.log(env);
沙箱机制
Deno 运行环境使用沙箱机制保护代码免受恶意代码的攻击,因此 JavaScript 代码是无法访问系统级资源的。Deno 运行时会在运行代码前自动分配一个权限范围,只有在严格的限制范围内才能运行代码。在运行代码后,Deno 会根据代码的行为来自动增加或减少其权限范围。
// 修改权限范围 await Deno.permissions.request({ name: "net" });
内置 TypeScript 支持
Deno 支持 TypeScript,它内置了 TypeScript 编译器。在执行 JavaScript 代码之前,Deno 会先将 TypeScript 代码编译成纯 JavaScript 代码,从而避免了代码中的一些问题,比如类型错误等。
-- -------------------- ---- ------- -- ---------- -- -------- ------ ------- -- -------- ------ - ------ - - -- - -- --- ---------- -- -------- ------ -- - ------ - - -- -
注意事项
必须授予所有需要的权限
Deno 运行时默认禁止访问系统资源和外部服务,只有在明确授权的情况下才能使用它们。因此,我们必须使用 --allow-* 标记明确授权访问所需的权限,否则程序将无法访问系统资源和外部服务。
# 授权读取文件系统 $ deno run --allow-read index.ts # 授权访问网络 $ deno run --allow-net index.ts
跟踪依赖项
Deno 会自动跟踪程序的依赖项,以确保它们不会被恶意代码污染。但是,我们也必须自己审核代码或第三方依赖的代码,以确保它们不会包含任何漏洞或招致攻击。
# 查看依赖项 $ deno info index.ts
验证远程代码
我们应该尽量使用 HTTPS 方式获取依赖项,以确保它们没有被恶意代码污染。并且我们应该尽可能验证远程代码的完整性和真实性,以避免执行被篡改的代码。
// 验证 Hash const response = await fetch("https://example.com"); const data = await response.arrayBuffer(); const hash = crypto.subtle.digest("SHA-256", data); console.log(new Uint8Array(hash));
结论
Deno 是一个新的运行时环境,它致力于提供更好的安全性和开发体验。通过默认禁止访问本地文件系统、网络和环境变量,使用沙箱机制,内置 TypeScript 支持等功能,我们可以确保代码的安全性,避免使用在现有的 JavaScript 应用程序中的一些安全陷阱和漏洞。
我们必须谨慎使用 Deno 的程序,并遵循最佳实践规则,在代码的开发和测试过程中仔细审查程序和第三方依赖项,以确保代码的安全性。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/670dc9715f551281025e65e6