一、前言
代碼安全掃描階段,前端資源審計(jì)發(fā)現(xiàn)jQuery
版本過低導(dǎo)致生產(chǎn)系統(tǒng)存在CVE-2020-11022/CVE-2020-11023
類風(fēng)險(xiǎn)。且影響范圍:jQuery >= 1.0.3 < 3.5.0
。
該類風(fēng)險(xiǎn)為應(yīng)用安全缺陷類DXSS攻擊,攻擊者可以利用該漏洞注入惡意腳本代碼,并在受害者的瀏覽器上執(zhí)行。將導(dǎo)致受害者的個(gè)人信息泄露、賬戶被劫持、會(huì)話被劫持等安全問題??七\(yùn)中心給出的解決方案是升級jQuery版本至3.5.0或更高版本。
二、漏洞原理
見:jQuery最新xss漏洞分析——CVE-2020-11022/11023 - 云+社區(qū) - 騰訊云 (tencent.com)
三、修復(fù)方案
-
更新jQuery到3.5.0或更高版本;
-
使用XSS清理工具清理用戶輸入的HTML,官方推薦;
這里使用方案一,升級jQuery版本至3.6.0(點(diǎn)擊下載)。
3.1 升級jQuery
jQuery官網(wǎng):Official jQuery Blog | New Wave Javascript
項(xiàng)目中目前使用的jQuery是1.x。升級版本根據(jù)官方指引使用migrate插件。
在進(jìn)行版本升級時(shí),官網(wǎng)給出的升級方法為:
Aside from the change to no longer ensure XHTML-compliant tags for you, we do not expect other compatibility issues when upgrading from a jQuery 3.0+ version. To upgrade, have a look at the new 3.5 Upgrade Guide. If you haven’t yet upgraded to jQuery 3+, first have a look at the 3.0 Upgrade Guide.
翻譯出來即:
從jQuery
3.0+版本升級時(shí),除了不再確保xhtml兼容的標(biāo)簽之外,我們預(yù)計(jì)不會(huì)出現(xiàn)其他兼容性問題。要升級至新版本,請查看新的3.5升級指南。如果你還沒有升級到j(luò)Query 3+,首先參考3.0升級指南。
3.0升級指南指出,
按照指引,先將1.x升級至1.x版本最新的1.12.3,并同時(shí)使用migrate 1.4.1插件,對警示信息指出的問題進(jìn)行修改。然后再升級至當(dāng)前最新的3.x版本,同時(shí)使用migrate 3.x插件。
可以理解為,jQuery 1.x升級至jQuery 3.x,需要借助migrate 1.x工具先將當(dāng)前低版本jQuery追平至jQuery 1.x的最高版本;追評后,再借助migrate 3.x由jQuery 1.x最高版本追平至3.x。
下載 jQuery-migrate
-
jquery-migrate-1.4.1.min.js 壓縮版本
-
jquery-migrate-1.4.1.js 未壓縮版本
-
jquery-migrate-3.4.0.min.js 壓縮版本
-
jquery-migrate-3.4.0.js 未壓縮版本
上面的鏈接點(diǎn)進(jìn)去得到的是壓縮過后的內(nèi)容:
將所有內(nèi)容進(jìn)行復(fù)制,在vsCode里面創(chuàng)建一個(gè)jquery-migrate-1.4.1.min.js
的文件,將復(fù)制的代碼粘貼進(jìn)去,便得到了相應(yīng)的依賴文件。
項(xiàng)目中使用
<script src="/js/jquery.min.js"></script>
<script src="/js/jquery-migrate-1.4.1.min.js"></script>
3.2 1.x 升級至 3.x 需要考慮的問題
3.2.1 table表格元素自動(dòng)添加tbody
1.x版本
3.x版本
如上圖所示,同樣是往table
里插入tr
,jQuery 1.x 版本會(huì)自動(dòng)添加tbody
, 而jQuery 3.x不會(huì),導(dǎo)致后來獲取table.children()
時(shí)出現(xiàn)不一致的結(jié)果。
3.2.2 方法變更
jquery由1.x升級到3.x后,$(window).load(function(){})
,在jquery3.x以上成了 $(window).on('load',function(){})
,且項(xiàng)目報(bào)錯(cuò) Uncaught TypeError: e.indexOf is not a function
注意??:.load()
, .unload()
, and .error()
從jQuery 1.8開始就被廢棄了,換成使用.on()
函數(shù)來注冊。
jQuery升級至高版本后,需要兼容舊代碼,可以使用js兼容包jQuery Migrate
。jQuery Migrate
是應(yīng)用遷移輔助插件,是用于高級版本兼容低級版本輔助插件。
引入jquery-migrate
插件用于兼容低版本,同時(shí)也會(huì)顯示低版本方法替換成新版本方法的方案。
<script src="/js/jquery-3.6.0.min.js" type="text/javascript"></script>
<script src="/js/jquery-migrate-3.3.2.min.js" type="text/javascript"></script>
查詢了官方文檔,廢棄方法詳參。
3.0以后的版本主要棄用的API有:.bind()
、.unbind()
、.delegate()
、.undelegate()
、jquery.fx.interval
。
1.9和1.10版本棄用的API有jquery.support()
、.context()
。
-
jQuery 1.9不再支持
$.browser
和$.browser.version
,取而代之的是$.support
。在更新的 2.0 版本中,將不再支持 IE 6/7/8。 -
$("#id").val(index);
之前1.8.2,當(dāng)index不存在時(shí)會(huì)默認(rèn)選取第一個(gè),升級3.3.1之后,如果不存在不會(huì)有默認(rèn)選項(xiàng),顯示也是空白。 -
$.post(...). error(function()
錯(cuò)誤回調(diào)方法報(bào)錯(cuò):Uncaught TypeError: $.post(...).error is not a function
原因:$.post()
使用連綴.error()
方法提示錯(cuò)誤,連綴方法被.fail()
取代。
綜合考慮,jQuery在由低版本升級至高版本時(shí),需要借助應(yīng)用遷移輔助插件 jQuery Migrate,實(shí)現(xiàn)高級版本兼容低級版本。
3.3 jquery migrate是什么
jQuery Migrate 是應(yīng)用遷移輔助插件,是用于高級版本兼容低級版本的輔助插件。
例如jQuery版本用的是1.x,計(jì)劃升級到3.x,就可以在頁面刪除1.x版本,換成3.x版本,如果有腳本錯(cuò)誤,就引入jquery-migrate
插件用于兼容低版本,同時(shí)也顯示低版本方法替換成新版本方法的方案。
jQuery migrate
(轉(zhuǎn)移、過度) jquery 升級后新舊代碼不兼容問題,此包就是解決此問題的。 就是把不支持的函數(shù)再寫出來支持下。
jQuery 版本之間有區(qū)別。比如1.9版本對于 live()
,die()
,toggle()
,sub()
,$.browser
等等都已經(jīng)不支持了。 在不改變系統(tǒng)代碼的同時(shí),要使用 1.9 之后的版本,就需要使用 jQuery migrate
(轉(zhuǎn)移、過度)。
應(yīng)用示例如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>test</title>
<script type="text/javascript" src="jquery-1.6.1.js"></script>
<script type="text/javascript">
$(document).ready(function(){
$("button").click(function(){
alert($("li").size());
});
});
</script>
</head>
<body>
<button>測試按鈕</button>
<ul>
<li>Coffee</li>
<li>Milk</li>
<li>Soda</li>
</ul>
</body>
</html>
點(diǎn)擊按鈕,彈出“3”。
把<script type="text/javascript" src="jquery-1.6.1.js"></script>
替換成<script type="text/javascript" src="jquery-3.3.1.js"></script>
這時(shí)點(diǎn)擊按鈕,在Chrome瀏覽器開發(fā)者窗口中顯示腳本錯(cuò)誤:
$(...).size is not a function
在頁面再引入<script src="jquery-migrate-3.0.1.js"></script>
,點(diǎn)擊按鈕,正常彈出“3”。
同時(shí)提示size
方法被棄用并使用length
代替:jQuery.fn.size() is deprecated and removed; use the .length property
。
把 $("li").size()
改成$("li").length
,移除jquery-migrate-3.0.1.js
,點(diǎn)擊按鈕,彈出“3”。
遷移方法完成。文章來源:http://www.zghlxwxcb.cn/news/detail-743805.html
總結(jié):jQuery migrate
其實(shí)是將待升級目標(biāo)jQuery版本之前的廢棄方法進(jìn)行匯總,并在檢測到用戶使用廢棄方法時(shí),自動(dòng)調(diào)用jQuery migrate
集成的廢棄方法,同時(shí)控制臺(tái)提示用戶當(dāng)前使用方法在高版本jQuery中已被廢棄,并給出高版本中相應(yīng)的替換方法。相應(yīng)的,jQuery migrate
就與jQuery
版本間產(chǎn)生了關(guān)聯(lián)關(guān)系,若應(yīng)用版本錯(cuò)誤,就可能導(dǎo)致jQuery migrate
中未集成廢棄方法,應(yīng)用廢棄方法時(shí)報(bào)錯(cuò)。理論上,若jQuery發(fā)布最新版本時(shí),同時(shí)發(fā)布最新版本的jQuery migrate
,應(yīng)用最新版本的jQuery migrate
就不會(huì)產(chǎn)生應(yīng)用廢棄方法報(bào)錯(cuò)的問題文章來源地址http://www.zghlxwxcb.cn/news/detail-743805.html
四、拓展閱讀
- jQuery官網(wǎng)
- jQuery 3.6.0(點(diǎn)擊下載)
- jQuery最新xss漏洞分析——CVE-2020-11022/11023 - 云+社區(qū) - 騰訊云 (tencent.com)
- Deprecated 3.5
- jQuery migrate
到了這里,關(guān)于安全生產(chǎn):CVE-2020-11022/CVE-2020-11023漏洞解析的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!