jQuery是一個JavaScript UI框架,它爲許多DOM操做功能提供了一個抽象層。它爲開發人員提供了一個友好的界面,能夠快速,動態地更新DOM,而無需從新加載整個頁面。這是 jQuery 的優勢及概念。javascript
但 jQuery 在有着諸多優勢的同時,它自己也存一些安全問題,而全部的 jQuery 安全問題都圍繞着那些被濫用的功能,jQurey 團隊修改了行爲來保護開發人員,下面來看看常見的 jQuery 安全問題的風險。html
$() 與 jQuery() 函數的最多見的書寫形式是同樣的,它返回一個jQuery對象:本質上要寫入DOM的內容塊。java
在大多數狀況下,jQuery函數將使用選擇器,元素或對象做爲參數。由哈希(#)表示的選擇器是當前DOM中現有html內容的標識符。在下面的例子中,咱們將使用jQuery html()函數來修改#myDivTag選擇器的元素:jquery
注意 「個人舊div標籤文本!」 不顯示。jQuery在運行時修改DOM來替換咱們的div元素的文本:ajax
再看看下面的例子:api
根據這個例子能夠看到,jQuery函數相似於getElementById()函數。可是有一個重要的區別:jQuery接受的不單單是一個選擇器ID,包括HTML和腳本內容。好比:跨域
jQuery框架中沒有已知的直接XSS漏洞(不包括jQuery插件)。但對於不受信任的內容引入到 jQuery 時,DOM (innerHTML,document.write()等)可能會被修改。瀏覽器
如下是最多見的漏洞代碼示例:安全
在下面的頁面中,咱們能夠直接在瀏覽器DOM中引入任意腳本,甚至繞過Chrome的 XSS審覈:框架
這個XSS向量是很常見的,jQuery最終改變了選擇器處理特性,爲防止這種攻擊。咱們阻止以「#」開始的HTML字符串,並從window.location.hash 中開始阻止 XSS
模擬XSS問題:Bug 9521 - $("#<img src=x onerror=...>")
在如下使用jQuery 1.6.1的例子中,模擬了XSS錯誤。這將以#字符開頭,從location.hash屬性中消耗的腳本:
代碼成功執行。
在下面的示例中,咱們將jQuery升級到1.6.3並運行相同的代碼:
代碼再也不運行,也就是說 jQuery-1.6.3 這個版本能夠阻止像剛剛這種:Bug 9521 - $("#<img src=x onerror=...>") 的問題。
模擬XSS問題:Bug 11290 - $("element[attribute='<img src=x onerror=...>'")
前面提到的 jQuery接受的不單單是一個選擇器ID,還包括HTML和腳本內容。 jQuery可能會錯誤地識別一個包含 < 做爲HTML片斷的選擇器,並嘗試解析並建立相關的元素
如圖:咱們引入了 jQuery-1.6.3.js 版本,並定義了<div data-val='<img src="x" onerror="console.log(xss!)">'></div>,最後執行結果以下:會發現 Bug 11290 代碼被執行了
但當我換成 jQuery-1.12.4.js 版本時,Bug 11290 代碼不會執行,而會報錯:
3、jQuery的AJAX $ .get()響應處理弱點
jQuery ajax $ .get()函數(不要與.get()函數混淆)用於使您可能猜到的ajax GET請求。發如今1.12.0以前的版本會自動評估響應內容,若是包含在響應中,則可能會執行腳本。
此行爲可能會促進應用程序中的兩個潛在漏洞。
示例:當咱們在頁面上發送請求:$.get('http://sakurity.com/jqueryxss') 時,攻擊者可能會用 type="text/javascript" 來回應咱們,並寫上惡意的執行代碼,如:
模擬 $.get()響應 問題:jQuery issue 2432 - 3rd party $.get() auto executes if content type is text/javascript
test.html 頁面:
在 https://sakurity.com/jqueryxss 網站上惡意彈出一個層
最終 test.html 頁面執行效果:會執行並彈出 https://sakurity.com/jqueryxss 網站上聲明的惡意腳本
總結:
像幾乎全部的現代軟件同樣,jQuery旨在強大而多功能。有無數安全和合法的功能,在濫用時可能會致使安全漏洞。這裏描述的jQuery問題都是軟件的結果,該軟件按照設計運行,可是被不正確地執行。
另附上連接:http://research.insecurelabs.org/jquery/test/ 可查看 jQuery 各版本關於 Bug 952一、Bug 11290、jQuery issue 2432 問題
本文參考文章連接:https://www.virtuesecurity.com/blog/jquery-security-model/