Nodejs沙箱逃逸--總結

一、沙箱逃逸概念

  • JavaScript和Nodejs之間有什么區別:JavaScript用在瀏覽器前端,后來將Chrome中的v8引擎單獨拿出來為JavaScript單獨開發了一個運行環境,因此JavaScript也可以作為一門后端語言,寫在后端(服務端)的JavaScript就叫叫做Nodejs。
  • 什么是沙箱(sandbox)當我們運行一些可能會產生危害的程序,我們不能直接在主機的真實環境上進行測試,所以可以通過單獨開辟一個運行代碼的環境,它與主機相互隔離,但使用主機的硬件資源,我們將有危害的代碼在沙箱中運行只會對沙箱內部產生一些影響,而不會影響到主機上的功能,沙箱的工作機制主要是依靠重定向,將惡意代碼的執行目標重定向到沙箱內部。
  • 沙箱(sandbox)和 虛擬機(VM)和 容器(Docker)之間的區別:sandbox和VM使用的都是虛擬化技術,但二者間使用的目的不一樣。沙箱用來隔離有害程序,而虛擬機則實現了我們在一臺電腦上使用多個操作系統的功能。Docker屬于sandbox的一種,通過創造一個有邊界的運行環境將程序放在里面,使程序被邊界困住,從而使程序與程序,程序與主機之間相互隔離開。在實際防護時,使用Docker和sandbox嵌套的方式更多一點,安全性也更高。
  • 在Nodejs中,我們可以通過引入vm模塊來創建一個“沙箱”,但其實這個vm模塊的隔離功能并不完善,還有很多缺陷,因此Node后續升級了vm,也就是現在的vm2沙箱,vm2引用了vm模塊的功能,并在其基礎上做了一些優化。

二、Node將字符串執行為代碼

方法一 eval

首先我在目錄下創建一個age.txt

var age = 18

創建一個y1.js

const fs = require('fs')let content = fs.readFileSync('age.txt', 'utf-8')console.log(content)eval(content)console.log(age)

這里因為我沒有配置Node.js,所以我將代碼改為.txt在瀏覽器中為大家調試(結果一樣)

fetch('age.txt').then(response => response.text()).then(content => {console.log(content);eval(content);console.log(age);}).catch(error => console.error('An error occurred:', error));

?結果:

?可以發現我們通過eval執行了一個字符串,但是這種執行方式如果在當前作用域下已經有了同名的age變量,這個程序就會報錯。

?相同變量程序報錯:

?在js中每一個模塊都有自己獨立的作用域,所以用eval執行字符串代碼很容易出現上面的這個問題,我們再看另外一種方法。

方法二:new Function

上面的方法因為模塊間的作用域被限制了使用,那么我們考慮一下如果能夠自己創建一個作用域是不是就可以更加方便的執行代碼呢?new Function的第一個參數是形參名稱,第二個參數是函數體。

我們都知道函數內和函數外是兩個作用域,不過當在函數中的作用域想要使用函數外的變量時,要通過形參來傳遞,當參數過多時這種方法就變的麻煩起來了。

從上面兩個執行代碼的例子可以看出來其實我們的思想就是如何創建一個能夠通過傳一個字符串就能執行代碼,并且還與外部隔絕的作用域,這也就是vm模塊的作用。

三、Nodejs作用域

說到作用域,我們就要說一下Node中的作用域是怎么分配的(在Node中一般把作用域叫上下文)。

在Web端(瀏覽器),發揮作用的一般是JavaScript,學過JavaScript的師傅應該都知道我們打開瀏覽器的窗口是JavaScript中最大的對象window,那么在服務端發揮作用的Node它的構造和JavaScript不太一樣。

我們在寫一個Node項目時往往要在一個文件里ruquire其他的js文件,這些文件我們都給它們叫做“包”。每一個包都有一個自己的上下文,包之間的作用域是互相隔離不互通的,也就是說就算我在y1.js中require了y2.js,那么我在y1.js中也無法直接調用y2.js中的變量和函數,舉個例子。

在同一級目錄下有y1.jsy2.js兩個文件

y1.js:

var age = 20

y2.js:

const a = require("./y1")console.log(a.age)
運行y2.js發現報錯:

那么我們想y2中引入并使用y1中的元素應該怎么辦呢,Node給我們提供了一個將js文件中元素輸出的接口exports?,把y1修改成下面這樣:

y1.js:

var age = 20exports.age = age

我們再運行y2就可以拿到age的值了

圖解:

?這個時候就有人會問左上角的global是什么?這里就要說到Nodejs中的全局對象了。

剛才我們提到在JavaScript中window是全局對象,瀏覽器其他所有的屬性都掛載在window下,那么在服務端的Nodejs中和window類似的全局對象叫做global,Nodejs下其他的所有屬性和包都掛載在這個global對象下。在global下掛載了一些全局變量,我們在訪問這些全局變量時不需要用global.xxx的方式來訪問,直接用xxx就可以調用這個變量。舉個例子,console就是掛載在global下的一個全局變量,我們在用console.log輸出時并不需要寫成global.console.log,其他常見全局變量還有process(一會逃逸要用到)。

我們也可以手動聲明一個全局變量,但全局變量在每個包中都是共享的,所以盡量不要聲明全局變量,不然容易導致變量污染。用上面的代碼舉個例子:

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/43205.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/43205.shtml
英文地址,請注明出處:http://en.pswp.cn/news/43205.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

七夕特輯——3D愛心(可監聽鼠標移動)

前言 「作者主頁」:雪碧有白泡泡 「個人網站」:雪碧的個人網站 「推薦專欄」: ★java一站式服務 ★ ★ React從入門到精通★ ★前端炫酷代碼分享 ★ ★ 從0到英雄,vue成神之路★ ★ uniapp-從構建到提升★ ★ 從0到英雄&#xff…

【005】ts學習筆記【函數擴展】

函數擴展 參數類型 //注意,參數不能多傳,也不能少傳 必須按照約定的類型來 const fn (name: string , age : number ) : string > {return name age }let desc fn( "張三", 18) console.log(desc)可選參數與默認值 //可選的參數 和 默…

深入理解Flink Mailbox線程模型

文章目錄 整體設計processMail1.Checkpoint Tigger2.ProcessingTime Timer Trigger processInput兼容SourceStreamTask 整體設計 Mailbox線程模型通過引入阻塞隊列配合一個Mailbox線程的方式,可以輕松修改StreamTask內部狀態的修改。Checkpoint、ProcessingTime Ti…

@Repeatable的作用以及具體如何使用

文章目錄 1. 前言2. 先說結論3. 案例演示 1. 前言 最近無意看到某些注解上有Repeatable,出于比較好奇,因此稍微研究并寫下此文章。 2. 先說結論 Repeatable的作用:使被他注釋的注解可以在同一個地方重復使用。 具體使用如下: T…

CentOS7源碼安裝MySQL詳細教程

😊 作者: Eric 💖 主頁: https://blog.csdn.net/weixin_47316183?typeblog 🎉 主題:CentOS7源碼安裝MySQL詳細教程 ?? 創作時間: 2023年08月014日 文章目錄 1、安裝的四種方式2、源碼安裝…

深度解析:DDoS攻擊與先進防御策略

目錄 DDoS 介紹 DDoS 攻擊理論 DDoS 介紹 DDoS(分布式拒絕服務)攻擊是一種惡意網絡活動,旨在通過同時向目標系統發送大量請求或流量,使其無法正常運行或提供服務。攻擊者通常利用網絡上的多個計算機和設備,形成一個&…

極智嘉x吉利汽車 x京東物流,引領汽車行業智慧物流新變革!

近日,中國領先的汽車制造商吉利汽車攜手中國領先的技術驅動的供應鏈解決方案及物流服務商京東物流、全球倉儲機器人引領者極智嘉(Geek),在西安吉利汽車制造基地RDC倉庫率先落地SkyPick上存下揀解決方案,實現了全物流鏈精益化、智能化、一體化…

Spring-4-掌握Spring事務傳播機制

今日目標 能夠掌握Spring事務配置 Spring事務管理 1 Spring事務簡介【重點】 1.1 Spring事務作用 事務作用:在數據層保障一系列的數據庫操作同成功同失敗 Spring事務作用:在數據層或業務層保障一系列的數據庫操作同成功同失敗 1.2 案例分析Spring…

STM32--TIM定時器(2)

文章目錄 輸出比較PWM輸出比較通道參數計算舵機簡介直流電機簡介TB6612 PWM基本結構PWM驅動呼吸燈PWM驅動舵機PWM控制電機 輸出比較 輸出比較,簡稱OC(Output Compare)。 輸出比較的原理是,當定時器計數值與比較值相等或者滿足某種…

【數據結構OJ題】有效的括號

原題鏈接:https://leetcode.cn/problems/valid-parentheses/ 目錄 1. 題目描述 2. 思路分析 3. 代碼實現 1. 題目描述 2. 思路分析 這道題目主要考查了棧的特性: 題目的意思主要是要做到3點匹配:類型、順序、數量。 題目給的例子是比較…

【Hibench 】完成 HDP-Spark 性能測試

🍁 博主 "開著拖拉機回家"帶您 Go to New World.?🍁 🦄 個人主頁——🎐開著拖拉機回家_Linux,Java基礎學習,大數據運維-CSDN博客 🎐?🍁 🪁🍁 希望本文能夠給您帶來一定的…

單片機實訓報告

這周我們進行了單片機實訓,一周中我們通過七個項目1:P1 口輸入/輸出 2:繼電器控制 3 音頻控制 4:子程序設計 5:字符碰頭程序設計 6:外部中斷 7: 急救車與交通信號燈,練習編寫了子程…

mysql 設置 mysql 日志時間與系統時間保持一致

臨時設置 mysql> show variables like %log_timestamps%;-----------------------| Variable_name | Value |-----------------------| log_timestamps | UTC |-----------------------1 row in set (0.00 sec)系統是 CST , nysql 是 UTC當UTC時間為0點時&am…

docker的使用方法總結

Docker是一個非常強大的工具,它可以用于創建、部署和運行應用程序。以下是一些docker相關的常用指令, 1、查看docker版本 docker version 2、查看正在運行的Docker容器 docker ps 3、查看所有的docker容器(包括沒有運行的容器&#xff0…

Python 之 Http 獲取網頁的 html 數據,并去掉 html 格式等相關信息

Python之 Http 獲取網頁的 html 數據,并去掉 html 格式等相關信息 目錄 Python之 Http 獲取網頁的 html 數據,并去掉 html 格式等相關信息

SCF金融公鏈新加坡啟動會 創新驅動未來

新加坡迎來一場引人矚目的金融科技盛會,SCF金融公鏈啟動會于2023年8月13日盛大舉行。這一受矚目的活動將為金融科技領域注入新的活力,并為廣大投資者、合作伙伴以及關注區塊鏈發展的人士提供一個難得的交流平臺。 在SCF金融公鏈啟動會上, Wil…

級聯(數據字典)

二級級聯: 一:新建兩個Bean 父級: /*** Description 數據字典* Author WangKun* Date 2023/7/25 10:15* Version*/ Data AllArgsConstructor NoArgsConstructor TableName("HW_DICT_KEY") public class DictKey implements Seri…

excel快速選擇數據、選擇性粘貼、凍結單元格

一、如何快速選擇數據 在excel中,希望選擇全部數據,通常使用鼠標選擇數據然后往下拉,當數據很多時,也可單擊單元格使用ctrl A選中全部數據,此外,具體介紹另一種方法。 操作:ctrl shift 方向…

【C++】STL---list

STL---list 一、list 的介紹二、list 的模擬實現1. list 節點類2. list 迭代器類(1)前置(2)后置(3)前置- -、后置- -(4)! 和 運算符重載(5)* 解引用重載 和 …

css3新增屬性

文章目錄 css3新增屬性box-shadowborder-radius設置橢圓 position: sticky;漸變背景線性漸變可重復的漸變背景 徑向漸變可重復的漸變背景 過渡分屬性 動畫關鍵幀與transition的關系demo 變形平移使用 旋轉使用 其他使用立體效果perspective元素位于3D空間還是平面中 縮放變形的…