當前位置:首頁 » 編程軟體 » XSS跨站腳本攻擊剖析與防禦

XSS跨站腳本攻擊剖析與防禦

發布時間: 2022-09-18 09:06:01

Ⅰ 如何正確防禦xss攻擊

傳統防禦技術

2.1.1基於特徵的防禦

傳統XSS防禦多採用特徵匹配方式,在所有提交的信息中都進行匹配檢查。對於這種類型的XSS攻擊,採用的模式匹配方法一般會需要對「javascript」這個關鍵字進行檢索,一旦發現提交信息中包含「javascript」,就認定為XSS攻擊。

2.1.2 基於代碼修改的防禦

和SQL注入防禦一樣,XSS攻擊也是利用了Web頁面的編寫疏忽,所以還有一種方法就是從Web應用開發的角度來避免:

1、對所有用戶提交內容進行可靠的輸入驗證,包括對URL、查詢關鍵字、HTTP頭、POST數據等,僅接受指定長度范圍內、採用適當格式、採用所預期的字元的內容提交,對其他的一律過濾。

2、實現Session標記(session tokens)、CAPTCHA系統或者HTTP引用頭檢查,以防功能被第三方網站所執行。

3、確認接收的的內容被妥善的規范化,僅包含最小的、安全的Tag(沒有javascript),去掉任何對遠程內容的引用(尤其是樣式表和javascript),使用HTTP only的cookie。

當然,如上方法將會降低Web業務系統的可用性,用戶僅能輸入少量的制定字元,人與系統間的交互被降到極致,僅適用於信息發布型站點。

並且考慮到很少有Web編碼人員受過正規的安全培訓,很難做到完全避免頁面中的XSS漏洞。

(1)XSS跨站腳本攻擊剖析與防禦擴展閱讀:

XSS攻擊的危害包括

1、盜取各類用戶帳號,如機器登錄帳號、用戶網銀帳號、各類管理員帳號

2、控制企業數據,包括讀取、篡改、添加、刪除企業敏感數據的能力

3、盜竊企業重要的具有商業價值的資料

4、非法轉賬

5、強制發送電子郵件

6、網站掛馬

7、控制受害者機器向其它網站發起攻擊

受攻擊事件

新浪微博XSS受攻擊事件

2011年6月28日晚,新浪微博出現了一次比較大的XSS攻擊事件。

大量用戶自動發送諸如:

「郭美美事件的一些未注意到的細節」,「建黨大業中穿幫地方」,「讓女人心動的100句詩歌」,「這是傳說中的神仙眷侶啊」等等微博和私信,並自動關注一位名為hellosamy的用戶。

事件的經過線索如下:

20:14,開始有大量帶V的認證用戶中招轉發蠕蟲

20:30,某網站中的病毒頁面無法訪問

20:32,新浪微博中hellosamy用戶無法訪問

21:02,新浪漏洞修補完畢

網路貼吧xss攻擊事件

2014年3月9晚,六安吧等幾十個貼吧出現點擊推廣貼會自動轉發等。並且吧友所關注的每個關注的貼吧都會轉一遍,病毒循環發帖。並且導致吧務人員,和吧友被封禁。

Ⅱ Web前端新手應該如何防禦XSS攻擊

今天小編要跟大家分享的文章是關於Web前端新手應該如何防禦XSS攻擊。作為JS系工程師接觸最多的漏洞我想就是XSS漏洞了,然而並不是所有的同學對其都有一個清晰的認識。今天我們分享一下XSS漏洞攻擊,希望能幫助到大家。下面我們來一起看一看吧!一、什麼是XSS攻擊XSS(Cross-SiteScripting)又稱跨站腳本,XSS的重點不在於跨站點,而是在於腳本的執行。XSS是一種經常出現在Web應用程序中的計算機安全漏洞,是由於Web應用程序對用戶的輸入過濾不足而產生的。


常見的XSS攻擊有三種:反射型、DOM-based型、存儲型。其中反射型、DOM-based型可以歸類為非持久型XSS攻擊,存儲型歸類為持久型XSS攻擊。


1、反射型


反射型XSS一般是攻擊者通過特定手法(如電子郵件),誘使用戶去訪問一個包含惡意代碼的URL,當受害者點擊這些專門設計的鏈接的時候,惡意代碼會直接在受害者主機上的瀏覽器執行。


對於訪問者而言是一次性的,具體表現在我們把我們的惡意腳本通過URL的方式傳遞給了伺服器,而伺服器則只是不加處理的把腳本「反射」回訪問者的瀏覽器而使訪問者的瀏覽器執行相應的腳本。反射型XSS的觸發有後端的參與,要避免反射性XSS,必須需要後端的協調,後端解析前端的數據時首先做相關的字串檢測和轉義處理。


此類XSS通常出現在網站的搜索欄、用戶登錄口等地方,常用來竊取客戶端Cookies或進行釣魚欺騙。


整個攻擊過程大約如下:

2、DOM-based型


客戶端的腳本程序可以動態地檢查和修改頁面內容,而不依賴於伺服器端的數據。例如客戶端如從URL中提取數據並在本地執行,如果用戶在客戶端輸入的數據包含了惡意的JavaScript腳本,而這些腳本沒有經過適當的過濾和消毒,那麼應用程序就可能受到DOM-basedXSS攻擊。需要特別注意以下的用戶輸入源document.URL、location.hash、location.search、document.referrer等。


整個攻擊過程大約如下:

3、存儲型


攻擊者事先將惡意代碼上傳或儲存到漏洞伺服器中,只要受害者瀏覽包含此惡意代碼的頁面就會執行惡意代碼。這就意味著只要訪問了這個頁面的訪客,都有可能會執行這段惡意腳本,因此儲存型XSS的危害會更大。


存儲型XSS一般出現在網站留言、評論、博客日誌等交互處,惡意腳本存儲到客戶端或者服務端的資料庫中。


整個攻擊過程大約如下:


二、XSS攻擊的危害XSS可以導致:


1、攻擊劫持訪問;


2、盜用cookie實現無密碼登錄;


3、配合csrf攻擊完成惡意請求;


4、使用js或css破壞頁面正常的結構與樣式等;三、防禦方法1、XSS防禦之HTML編碼


應用范圍:將不可信數據放入到HTML標簽內(例如div、span等)的時候進行HTML編碼。


編碼規則:將&<>"'/轉義為實體字元(或者十進制、十六進制)。


示例代碼:


_unction_ncodeForHTML(str,_wargs){
__return(''+_tr)
___.replace(/&/g,'&')
___.replace(/<_EX=><_ntity=><
___.replace(/>/g,'>')
___.replace(/"/g,'"')
___.replace(/'/g,''')_//'_煌萍觶蛭輝_TML規范中
___.replace(///g,'/');
_};


HTML有三種編碼表現方式:十進制、十六進制、命名實體。例如小於號(<)可以編碼為"十進制><","十六進制=><","命名實體=><"三種方式。對於單引號(')由於實體字元編碼方式不在HTML規范中,所以此處使用了十六進制編碼。


2、XSS防禦之HTMLAttribute編碼


應用范圍:將不可信數據放入HTML屬性時(不含src、href、style和事件處理屬性),進行HTMLAttribute編碼


編碼規則:除了字母數字字元以外,使用HH;(或者可用的命名實體)格式來轉義ASCII值小於256所有的字元


示例代碼:


_unction_ncodeForHTMLAttibute(str,_wargs){
__let_ncoded=''
__for(let_=0;_<_tr.length;_++)_
___let_h=_ex=_tr[i];
___if(!/[A-Za-z0-9]/.test(str[i])&&_tr.charCodeAt(i)<256)_
____hex='&#x'+_h.charCodeAt(0).toString(16)+''
___}
___encoded+=_ex;
__}
__return_ncoded;
_};


3、XSS防禦之JavaScript編碼


作用范圍:將不可信數據放入事件處理屬性、JavaScirpt值時進行JavaScript編碼


編碼規則:除字母數字字元外,請使用xHH格式轉義ASCII碼小於256的所有字元


示例代碼:


_unction_ncodeForJavascript(str,_wargs)_
__let_ncoded=''
__for(let_=0;_<_tr.length;_++)_
___let_c=_ex=_tr[i];
___if(!/[A-Za-z0-9]/.test(str[i])&&_tr.charCodeAt(i)<256)_
____hex='\x'+_c.charCodeAt().toString(16);
___}
___encoded+=_ex;
__}
__return_ncoded;
_};


4、XSS防禦之URL編碼


作用范圍:將不可信數據作為URL參數值時需要對參數進行URL編碼


編碼規則:將參數值進行encodeURIComponent編碼


示例代碼:


_function_ncodeForURL(str,_wargs){
__return_ncodeURIComponent(str);
_};


5、XSS防禦之CSS編碼


作用范圍:將不可信數據作為CSS時進行CSS編碼


編碼規則:除了字母數字字元以外,使用XXXXXX格式來轉義ASCII值小於256的所有字元


示例代碼:


_unction_ncodeForCSS(attr,_tr,_wargs){
__let_ncoded=''
__for(let_=0;_<_tr.length;_++)_
___let_h=_tr.charAt(i);
___if(!ch.match(/[a-zA-Z0-9]/)_
____let_ex=_tr.charCodeAt(i).toString(16);
____let_ad=�'.substr((hex.length));
____encoded+='\'+_ad+_ex;
___}_lse_
____encoded+=_h;
___}
__}
__return_ncoded;
_};後記在任何時候用戶的輸入都是不可信的。對於HTTP參數,理論上都要進行驗證,例如某個欄位是枚舉類型,其就不應該出現枚舉以為的值;對於不可信數據的輸出要進行相應的編碼;此外httpOnly、CSP、X-XSS-Protection、SecureCookie等也可以起到有效的防護。


XSS漏洞有時比較難發現,所幸當下React、Vue等框架都從框架層面引入了XSS防禦機制,一定程度上解放了我們的雙手。但是作為開發人員依然要了解XSS基本知識、於細節處避免製造XSS漏洞。框架是輔助,我們仍需以人為本,規范開發習慣,提高Web前端安全意識。


以上就是小編今天為大家分享的關於Web前端新手應該如何防禦XSS攻擊的文章,希望本篇文章能夠對正在從事web前端工作的小夥伴們有所幫助。想要了解更多web前端相關知識記得關注北大青鳥web培訓官網。最後祝願小夥伴們工作順利!


作者:公子
鏈接:#/a/1190000017057646


Ⅲ 什麼是XSS攻擊

XSS攻擊又稱為跨站腳本,XSS的重點不在於跨站點,而是在於腳本的執行。XSS是一種經常出現在Web應用程序中的計算機安全漏洞,是由於Web應用程序對用戶的輸入過濾不足而產生的,它允許惡意web用戶將代碼植入到提供給其它用戶使用的頁面中。
常見的XSS攻擊有三種:反射型XSS攻擊、DOM-based型XSS攻擊、存儲型XSS攻擊。
第一種:反射型XSS攻擊
反射型XSS攻擊一般是攻擊者通過特定手法,誘使用戶去訪問一個包含惡意代碼的URL,當受害者點擊這些專門設計的鏈接的時候,惡意代碼會直接在受害者主機上的瀏覽器執行。此類XSS攻擊通常出現在網站的搜索欄、用戶登錄口等地方,常用來竊取客戶端Cookies或進行釣魚欺騙。
第二種:DOM-based型XSS攻擊
客戶端的腳本程序可以動態地檢查和修改頁面內容,而不依賴於伺服器端的數據。例如客戶端如從URL中提取數據並在本地執行,如果用戶在客戶端輸入的數據包含了惡意的JavaScript腳本,而這些腳本沒有經過適當的過濾或者消毒,那麼應用程序就可能受到DOM-based型XSS攻擊。需要特別注意以下的用戶輸入源document.URL、location.hash、location.search、document.referrer 等。
第三種:存儲型XSS攻擊
攻擊者事先將惡意代碼上傳或者儲存到漏洞伺服器中,只要受害者瀏覽包含此惡意代碼的頁面就會執行惡意代碼。這意味著只要訪問了這個頁面的訪客,都有可能會執行這段惡意腳本,因此存儲型XSS攻擊的危害會更大。此類攻擊一般出現在網站留言、評論、博客日誌等交互處,惡意腳本存儲到客戶端或者服務端的資料庫中。

Ⅳ xss漏洞如何防禦

1、基於特徵的防禦。XSS漏洞和著名的SQL注入漏洞一樣,都是利用了Web頁面的編寫不完善,所以每一個漏洞所利用和針對的弱點都不盡相同,這就是給XSS漏洞防禦帶來的困難,不可能以單一特徵來概括所有XSS攻擊。
傳統的XSS防禦在進行攻擊鑒別時多採用特徵匹配方式,主要是針對JavaScript這個關鍵詞進行檢索,但是這種鑒別不夠靈活,凡是提交的信息中各有JavaScript時,就被硬性的判定為XSS攻擊。
2、基於代碼修改的防禦。Web頁面開發者在編寫程序時往往會出現一些失誤或漏洞,XSS攻擊正是利用了失誤和漏洞,因此一種比較理想的方法就是通過優化Web應用開發來減少漏洞,避免被攻擊:
①用戶向伺服器上提交的信息要對URL和附帶的HTTP頭、POST數據等進行查詢,對不是規定格式、長度的內容進行過濾。
②實現Session標記、CAPTCHA系統或者HTTP引用頭檢查,以防功能被第三方網站所執行。
③確認接收的內容被妥善的規范化,僅包含最小的、安全的Tag,去掉任何對遠程內容的引用,使用HTTP only的cookie。
3、客戶端分層防禦策略。客戶端跨站腳本攻擊的分層防禦策略是基於獨立分配線程和分層防禦策略的安全模型。它建立在客戶端,這是它與其他模型最大的區別。之所以客戶端安全性如此重要,客戶端在接受伺服器信息,選擇性的執行相關內容。這樣就可以使防禦XSS攻擊變得容易,該模型主要由三大部分組成:
①對每一個網頁分配獨立線程且分析資源消耗的網頁線程分析模塊;
②包含分層防禦策略四個規則的用戶輸入分析模塊;
③保存互聯網上有關XSS惡意網站信息的XSS信息資料庫。

Ⅳ 什麼是xss攻擊

一、什麼是跨站腳本攻擊
跨站腳本攻擊(Cross Site Scripting)縮寫為CSS,但這會與層疊樣式表(Cascading Style Sheets,CSS)的縮寫混淆。通常將跨站腳本攻擊縮寫為XSS。
跨站腳本攻擊(XSS),是最普遍的Web應用安全漏洞。這類漏洞能夠使得攻擊者嵌入惡意腳本代碼到正常用戶會訪問到的頁面中,當正常用戶訪問該頁面時,則可導致嵌入的惡意腳本代碼的執行,從而達到惡意攻擊用戶的目的。
二、跨站腳本攻擊的種類
從攻擊代碼的工作方式可以分為三個類型:
1、持久型跨站:最直接的危害類型,跨站代碼存儲在伺服器(資料庫)。
2、非持久型跨站:反射型跨站腳本漏洞,最普遍的類型。用戶訪問伺服器-跨站鏈接-返回跨站代碼。
3、DOM跨站(DOM XSS):DOM(document object model文檔對象模型),客戶端腳本處理邏輯導致的安全問題。
三、跨站腳本攻擊的手段和目的
常用的XSS攻擊手段和目的有:
1、盜用cookie,獲取敏感信息。
2、利用植入Flash,通過crossdomain許可權設置進一步獲取更高許可權;或者利用Java等得到類似的操作。
3、利用iframe、frame、XMLHttpRequest或上述Flash等方式,以(被攻擊)用戶的身份執行一些管理動作,或執行一些一般的如發微博、加好友、發私信等操作。
4、利用可被攻擊的域受到其他域信任的特點,以受信任來源的身份請求一些平時不允許的操作,如進行不當的投票活動。
5、在訪問量極大的一些頁面上的XSS可以攻擊一些小型網站,實現DDoS攻擊的效果。
四、跨站腳本攻擊的防禦
XSS攻擊主要是由程序漏洞造成的,要完全防止XSS安全漏洞主要依靠程序員較高的編程能力和安全意識,當然安全的軟體開發流程及其他一些編程安全原則也可以大大減少XSS安全漏洞的發生。這些防範XSS漏洞原則包括:
1、不信任用戶提交的任何內容,對所有用戶提交內容進行可靠的輸入驗證,包括對URL、查詢關鍵字、HTTP頭、REFER、POST數據等,僅接受指定長度范圍內、採用適當格式、採用所預期的字元的內容提交,對其他的一律過濾。盡量採用POST而非GET提交表單;對「<」,「>」,「;」,「」」等字元做過濾;任何內容輸出到頁面之前都必須加以en-code,避免不小心把htmltag顯示出來。
2、實現Session 標記(session tokens)、CAPTCHA(驗證碼)系統或者HTTP引用頭檢查,以防功能被第三方網站所執行,對於用戶提交信息的中的img等link,檢查是否有重定向回本站、不是真的圖片等可疑操作。
3、cookie 防盜。避免直接在cookie中泄露用戶隱私,例如email、密碼,等等;通過使cookie和系統IP綁定來降低cookie泄露後的危險。這樣攻擊者得到的cookie沒有實際價值,很難拿來直接進行重放攻擊。
4、確認接收的內容被妥善地規范化,僅包含最小的、安全的Tag(沒有JavaScript),去掉任何對遠程內容的引用(尤其是樣式表和JavaScript),使用HTTPonly的cookie。

Ⅵ 跨站腳本攻擊xss的原理是什麼有什麼危害如何防範

xxs攻擊原理是網頁對用戶輸入的字元串過濾不嚴,導致在提交輸入信息的時候瀏覽器執行了黑客嵌入的xxs腳本,致使用戶信息泄露。黑客可將偽裝過的含義腳本語句的鏈接發送給受害者,當受害者點擊鏈接的時候,由於網頁沒有過濾腳本語句,所以瀏覽器執行了腳本語句,而這個腳本語句的作用是將用戶的cookie發送到黑客指定的地址,然後黑客就可以利用受害者的cookie竊取受害者的個人信息等等。這種攻擊對伺服器沒有多大危害,但對用戶危害很大,要防範這種攻擊應該在設計網站的時候對用戶提交的內容進行嚴格的過濾。

Ⅶ XSS攻擊的定義,類型以及防禦方法

XXS攻擊全稱跨站腳本攻擊,是一種在Web應用中的計算機安全漏洞,它允許惡意Web用戶將代碼植入到提供給其他使用的頁面中。

XSS攻擊有哪幾種類型?下面就由銳速雲的小編為大家介紹一下

經常見到XSS攻擊有三種:反射XSS攻擊、DOM-based型XSS攻擊以及儲存型XSS攻擊。

[if !supportLists]1、[endif]反射型XSS攻擊

反射性XSS一般是攻擊者通過特定手法(如電子郵件),誘使用戶去訪問一個包含惡意代碼的URL,當受害者點擊這些專門設計鏈接的時候,惡意代碼會直接在受害主機上的瀏覽器上執行,反射型XSS通常出現在網站搜索欄,用戶登入口等地方,常用來竊取客戶端或進行釣魚欺騙。

[if !supportLists]2、[endif]存儲型XSS攻擊

存儲型XSS攻擊也叫持久型XSS,主要將XSS代碼提交儲存在伺服器端(資料庫,內存,文件系統等)下次請求目標頁面時不用在提交XSS代碼。當目標用戶訪問該頁面獲取數據時,XSS代碼會從伺服器解析之後載入出來,返回到瀏覽器做正常的HTML和JS解析執行,XSS攻擊就發生了。儲存型XSS一般出現在網站留言,評論,博客日誌等交互處,惡意腳本儲存到客戶端或者服務端的資料庫中。

[if !supportLists]3、[endif]DOM-based型XSS攻擊

DOM-based型XSS攻擊它是基於DOM的XSS攻擊是指通過惡意腳本修改頁面的DOM結構,是純粹發生在客戶端的攻擊。DOM型XSS攻擊中,取出和執行惡意代碼由瀏覽器端完成,屬於前端JavaScript自身的安全漏洞。

如何防禦XSS攻擊?

[if !supportLists]1、[endif]對輸入內容的特定字元進行編碼,列如表示html標記<>等符號。

[if !supportLists]2、[endif]對重要的cookie設置httpOnly,防止客戶端通過document。cookie讀取cookie,此HTTP開頭由服務端設置。

[if !supportLists]3、[endif]將不可信的輸出URT參數之前,進行URLEncode操作,而對於從URL參數中獲取值一定要進行格式檢查

[if !supportLists]4、[endif]不要使用Eval來解析並運行不確定的數據或代碼,對於JSON解析請使用JSON。Parse()方法

[if !supportLists]5、[endif]後端介面也應該要做到關鍵字元過濾的問題。

Ⅷ 如何防止xss攻擊

1. XSS攻擊原理

XSS原稱為CSS(Cross-Site Scripting),因為和層疊樣式表(Cascading Style Sheets)重名,所以改稱為XSS(X一般有未知的含義,還有擴展的含義)。XSS攻擊涉及到三方:攻擊者,用戶,web server。用戶是通過瀏覽器來訪問web server上的網頁,XSS攻擊就是攻擊者通過各種辦法,在用戶訪問的網頁中插入自己的腳本,讓其在用戶訪問網頁時在其瀏覽器中進行執行。攻擊者通過插入的腳本的執行,來獲得用戶的信息,比如cookie,發送到攻擊者自己的網站(跨站了)。所以稱為跨站腳本攻擊。XSS可以分為反射型XSS和持久性XSS,還有DOM Based XSS。(一句話,XSS就是在用戶的瀏覽器中執行攻擊者自己定製的腳本。)

1.1 反射型XSS

反射性XSS,也就是非持久性XSS。用戶點擊攻擊鏈接,伺服器解析後響應,在返回的響應內容中出現攻擊者的XSS代碼,被瀏覽器執行。一來一去,XSS攻擊腳本被web server反射回來給瀏覽器執行,所以稱為反射型XSS。

特點:

1> XSS攻擊代碼非持久性,也就是沒有保存在web server中,而是出現在URL地址中;

2> 非持久性,那麼攻擊方式就不同了。一般是攻擊者通過郵件,聊天軟體等等方式發送攻擊URL,然後用戶點擊來達到攻擊的;

1.2 持久型XSS

區別就是XSS惡意代碼存儲在web server中,這樣,每一個訪問特定網頁的用戶,都會被攻擊。

特點:

1> XSS攻擊代碼存儲於web server上;

2> 攻擊者,一般是通過網站的留言、評論、博客、日誌等等功能(所有能夠向web server輸入內容的地方),將攻擊代碼存儲到web server上的;

有時持久性XSS和反射型XSS是同時使用的,比如先通過對一個攻擊url進行編碼(來繞過xss filter),然後提交該web server(存儲在web server中), 然後用戶在瀏覽頁面時,如果點擊該url,就會觸發一個XSS攻擊。當然用戶點擊該url時,也可能會觸發一個CSRF(Cross site request forgery)攻擊。

1.3 DOM based XSS

基於DOM的XSS,也就是web server不參與,僅僅涉及到瀏覽器的XSS。比如根據用戶的輸入來動態構造一個DOM節點,如果沒有對用戶的輸入進行過濾,那麼也就導致XSS攻擊的產生。過濾可以考慮採用esapi4js。

Ⅸ 簡述xss的發展歷史

咨詢記錄 · 回答於2021-11-25

Ⅹ 解析如何防止XSS跨站腳本攻擊

不可信數據 不可信數據通常是來自HTTP請求的數據,以URL參數、表單欄位、標頭或者Cookie的形式。不過從安全形度來看,來自資料庫、網路伺服器和其他來源的數據往往也是不可信的,也就是說,這些數據可能沒有完全通過驗證。 應該始終對不可信數據保持警惕,將其視為包含攻擊,這意味著在發送不可信數據之前,應該採取措施確定沒有攻擊再發送。由於應用程序之間的關聯不斷深化,下游直譯程序執行的攻擊可以迅速蔓延。 傳統上來看,輸入驗證是處理不可信數據的最好辦法,然而,輸入驗證法並不是注入式攻擊的最佳解決方案。首先,輸入驗證通常是在獲取數據時開始執行的,而此時並不知道目的地所在。這也意味著我們並不知道在目標直譯程序中哪些字元是重要的。其次,可能更加重要的是,應用程序必須允許潛在危害的字元進入,例如,是不是僅僅因為SQL認為Mr. O'Malley名字包含特殊字元他就不能在資料庫中注冊呢? 雖然輸入驗證很重要,但這始終不是解決注入攻擊的完整解決方案,最好將輸入攻擊作為縱深防禦措施,而將escaping作為首要防線。 解碼(又稱為Output Encoding) 「Escaping」解碼技術主要用於確保字元作為數據處理,而不是作為與直譯程序的解析器相關的字元。有很多不同類型的解碼,有時候也被成為輸出「解碼」。有些技術定義特殊的「escape」字元,而其他技術則包含涉及若干字元的更復雜的語法。 不要將輸出解碼與Unicode字元編碼的概念弄混淆了,後者涉及映射Unicode字元到位序列。這種級別的編碼通常是自動解碼,並不能緩解攻擊。但是,如果沒有正確理解伺服器和瀏覽器間的目標字元集,有可能導致與非目標字元產生通信,從而招致跨站XSS腳本攻擊。這也正是為所有通信指定Unicode字元編碼(字元集)(如UTF-8等)的重要所在。 Escaping是重要的工具,能夠確保不可信數據不能被用來傳遞注入攻擊。這樣做並不會對解碼數據造成影響,仍將正確呈現在瀏覽器中,解碼只能阻止運行中發生的攻擊。 注入攻擊理論 注入攻擊是這樣一種攻擊方式,它主要涉及破壞數據結構並通過使用特殊字元(直譯程序正在使用的重要數據)轉換為代碼結構。XSS是一種注入攻擊形式,瀏覽器作為直譯程序,攻擊被隱藏在HTML文件中。HTML一直都是代碼和數據最差的mashup,因為HTML有很多可能的地方放置代碼以及很多不同的有效編碼。HTML是很復雜的,因為它不僅是層次結構的,而且還包含很多不同的解析器(XML、HTML、JavaScript、VBScript、CSS、URL等)。 要想真正明白注入攻擊與XSS的關系,必須認真考慮HTML DOM的層次結構中的注入攻擊。在HTML文件的某個位置(即開發者允許不可信數據列入DOM的位置)插入數據,主要有兩種注入代碼的方式: Injecting UP,上行注入 最常見的方式是關閉現有的context並開始一個新的代碼context,例如,當你關閉HTML屬性時使用">並開始新的 可以終止腳本塊,即使該腳本塊被注入腳本內方法調用內的引用字元,這是因為HTML解析器在JavaScript解析器之前運行。 Injecting DOWN,下行注入 另一種不太常見的執行XSS注入的方式就是,在不關閉當前context的情況下,引入一個subcontext。例如,將改為 ,並不需要躲開HTML屬性context,相反只需要引入允許在src屬性內寫腳本的context即可。另一個例子就是CSS屬性中的expression()功能,雖然你可能無法躲開引用CSS屬性來進行上行注入,你可以採用x ss:expression(document.write(document.cookie))且無需離開現有context。 同樣也有可能直接在現有context內進行注入,例如,可以採用不可信的輸入並把它直接放入JavaScript context。這種方式比你想像的更加常用,但是根本不可能利用escaping(或者任何其他方式)保障安全。從本質上講,如果這樣做,你的應用程序只會成為攻擊者將惡意代碼植入瀏覽器的渠道。 本文介紹的規則旨在防止上行和下行XSS注入攻擊。防止上行注入攻擊,你必須避免那些允許你關閉現有context開始新context的字元;而防止攻擊跳躍DOM層次級別,你必須避免所有可能關閉context的字元;下行注入攻擊,你必須避免任何可以用來在現有context內引入新的sub-context的字元。 積極XSS防禦模式 本文把HTML頁面當作一個模板,模板上有很多插槽,開發者允許在這些插槽處放置不可信數據。在其他地方放置不可信數據是不允許的,這是「白名單」模式,否認所有不允許的事情。 根據瀏覽器解析HTML的方式的不同,每種不同類型的插槽都有不同的安全規則。當你在這些插槽處放置不可信數據時,必須採取某些措施以確保數據不會「逃離」相應插槽並闖入允許代碼執行的context。從某種意義上說,這種方法將HTML文檔當作參數化的資料庫查詢,數據被保存在具體文職並與escaping代碼context相分離。 本文列出了最常見的插槽位置和安全放置數據的規則,基於各種不同的要求、已知的XSS載體和對流行瀏覽器的大量手動測試,我們保證本文提出的規則都是安全的。 定義好插槽位置,開發者們在放置任何數據前,都應該仔細分析以確保安全性。瀏覽器解析是非常棘手的,因為很多看起來無關緊要的字元可能起著重要作用。 為什麼不能對所有不可信數據進行HTML實體編碼? 可以對放入HTML文檔正文的不可行數據進行HTML實體編碼,如 標簽內。也可以對進入屬性的不可行數據進行實體編碼,尤其是當屬性中使用引用符號時。但是HTML實體編碼並不總是有效,例如將不可信數據放入 directlyinascript insideanHTMLcomment inanattributename <...NEVERPUTUNTRUSTEDDATAHERE...href="/test"/> inatagname 更重要的是,不要接受來自不可信任來源的JavaScript代碼然後運行,例如,名為「callback」的參數就包含JavaScript代碼段,沒有解碼能夠解決。 No.2 – 在向HTML元素內容插入不可信數據前對HTML解碼 這條規則適用於當你想把不可信數據直接插入HTML正文某處時,這包括內部正常標簽(div、p、b、td等)。大多數網站框架都有HTML解碼的方法且能夠躲開下列字元。但是,這對於其他HTML context是遠遠不夠的,你需要部署其他規則。 ...... ...... 以及其他的HTML常用元素 使用HTML實體解碼躲開下列字元以避免切換到任何執行內容,如腳本、樣式或者事件處理程序。在這種規格中推薦使用十六進制實體,除了XML中5個重要字元(&、<、 >、 "、 ')外,還加入了斜線符,以幫助結束HTML實體。 &-->& <-->< >-->> "-->" '-->''isnotrecommended /-->/ ESAPI參考實施 Stringsafe=ESAPI.encoder().encodeForHTML(request.getParameter("input")); No.3 – 在向HTML常見屬性插入不可信數據前進行屬性解碼 這條規則是將不可信數據轉化為典型屬性值(如寬度、名稱、值等),這不能用於復雜屬性(如href、src、style或者其他事件處理程序)。這是及其重要的規則,事件處理器屬性(為HTML JavaScript Data Values)必須遵守該規則。 content insidesinglequotedattribute 除了字母數字字元外,使用小於256的ASCII值&#xHH格式(或者命名的實體)對所有數據進行解碼以防止切換屬性。這條規則應用廣泛的原因是因為開發者常常讓屬性保持未引用,正確引用的屬性只能使用相應的引用進行解碼。未引用屬性可以被很多字元破壞,包括[space] % * + , - / ; < = > ^ 和 |。 ESAPI參考實施 String safe = ESAPI.encoder().encodeForHTMLAttribute( request.getParameter( "input" ) ); No.4 – 在向HTML JavaScript Data Values插入不可信數據前,進行JavaScript解碼 這條規則涉及在不同HTML元素上制定的JavaScript事件處理器。向這些事件處理器放置不可信數據的唯一安全位置就是「data value」。在這些小代碼塊放置不可信數據是相當危險的,因為很容易切換到執行環境,因此請小心使用。 insideaquotedstring onesideofanexpression insideUNquotedeventhandler insidequotedeventhandler insidequotedeventhandler 除了字母數字字元外,使用小於256的ASCII值xHH格式 對所有數據進行解碼以防止將數據值切換至腳本內容或者另一屬性。不要使用任何解碼捷徑(如" )因為引用字元可能被先運行的HTML屬性解析器相匹配。如果事件處理器被引用,則需要相應的引用來解碼。這條規則的廣泛應用是因為開發者經常讓事件處理器保持未引用。正確引用屬性只能使用相應的引用來解碼,未引用屬性可以使用任何字元(包括[space] % * + , - / ; < = > ^ 和|)解碼。同時,由於HTML解析器比JavaScript解析器先運行,關閉標簽能夠關閉腳本塊,即使腳本塊位於引用字元串中。 ESAPI參考實施 Stringsafe=ESAPI.encoder().encodeForJavaScript(request.getParameter("input")); No.5 – 在向HTML 樣式屬性值插入不可信數居前,進行CSS解碼 當你想將不可信數據放入樣式表或者樣式標簽時,可以用此規則。CSS是很強大的,可以用於許多攻擊。因此,只能在屬性值中使用不可信數據而不能在其他樣式數據中使用。不能將不可信數據放入復雜的屬性(如url,、behavior、和custom (-moz-binding))。同樣,不能將不可信數據放入允許JavaScript的IE的expression屬性值。 propertyvalue textpropertyvalue 除了字母數字字元外,使用小於256的ASCII值HH格式對所有數據進行解碼。不要使用任何解碼捷徑(如" )因為引用字元可能被先運行的HTML屬性解析器相匹配,防止將數據值切換至腳本內容或者另一屬性。同時防止切換至expression或者其他允許腳本的屬性值。如果屬性被引用,將需要相應的引用進行解碼,所有的屬性都應該被引用。未引用屬性可以使用任何字元(包括[space] % * + , - / ; < = > ^ 和|)解碼。同時,由於HTML解析器比JavaScript解析器先運行,標簽能夠關閉腳本塊,即使腳本塊位於引用字元串中。 ESAPI參考實施 Stringsafe=ESAPI.encoder().encodeForCSS(request.getParameter("input")); No.6- 在向HTML URL屬性插入不可信數據前,進行URL解碼 當你想將不可信數據放入鏈接到其他位置的link中時需要運用此規則。這包括href和src屬性。還有很多其他位置屬性,不過我們建議不要在這些屬性中使用不可信數據。需要注意的是在javascript中使用不可信數據的問題,不過可以使用上述的HTML JavaScript Data Value規則。 linkanormallink animagesource ascriptsource 除了字母數字字元外,使用小於256的ASCII值%HH 解碼格式對所有數據進行解碼。在數據中保護不可信數據:URL不能夠被允許,因為沒有好方法來通過解碼來切換URL以避免攻擊。所有的屬性都應該被引用。未引用屬性可以使用任何字元(包括[space] % * + , - / ; < = > ^ 和|)解碼。 請注意實體編碼在這方面是沒用的。

熱點內容
浪潮存儲厚積薄發圖片 發布:2025-04-13 22:37:54 瀏覽:487
sql新建作業 發布:2025-04-13 20:04:15 瀏覽:765
wp磁貼文件夾 發布:2025-04-13 19:49:06 瀏覽:493
桃子神社解壓碼 發布:2025-04-13 19:48:59 瀏覽:852
ubuntu配置nginxphp 發布:2025-04-13 19:30:02 瀏覽:820
小米解壓亂碼 發布:2025-04-13 19:04:57 瀏覽:767
sql2008技術內幕 發布:2025-04-13 19:04:52 瀏覽:498
python中單引號和雙引號 發布:2025-04-13 18:29:57 瀏覽:62
屏密碼怎麼取消 發布:2025-04-13 18:29:56 瀏覽:362
nc伺服器是什麼 發布:2025-04-13 18:14:55 瀏覽:107