成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

安全 應用安全
這些規則適用于所有不同類別的XSS跨站腳本攻擊,可以通過在服務端執行適當的解碼來定位映射的XSS以及存儲的XSS,由于XSS也存在很多特殊情況,因此強烈推薦使用解碼庫。另外,基于XSS的DOM也可以通過將這些規則運用在客戶端的不可信數據上來定位。

這些規則適用于所有不同類別的XSS跨站腳本攻擊,可以通過在服務端執行適當的解碼來定位映射的XSS以及存儲的XSS,由于XSS也存在很多特殊情況,因此強烈推薦使用解碼庫。另外,基于XSS的DOM也可以通過將這些規則運用在客戶端的不可信數據上來定位。

不可信數據

不可信數據通常是來自HTTP請求的數據,以URL參數、表單字段、標頭或者Cookie的形式。不過從安全角度來看,來自數據庫、網絡服務器和其他來源的數據往往也是不可信的,也就是說,這些數據可能沒有完全通過驗證。

應該始終對不可信數據保持警惕,將其視為包含攻擊,這意味著在發送不可信數據之前,應該采取措施確定沒有攻擊再發送。由于應用程序之間的關聯不斷深化,下游直譯程序執行的攻擊可以迅速蔓延。

傳統上來看,輸入驗證是處理不可信數據的最好辦法,然而,輸入驗證法并不是注入式攻擊的最佳解決方案。首先,輸入驗證通常是在獲取數據時開始執行的,而此時并不知道目的地所在。這也意味著我們并不知道在目標直譯程序中哪些字符是重要的。其次,可能更加重要的是,應用程序必須允許潛在危害的字符進入,例如,是不是僅僅因為SQL認為Mr. O'Malley名字包含特殊字符他就不能在數據庫中注冊呢?

雖然輸入驗證很重要,但這始終不是解決注入攻擊的完整解決方案,最好將輸入攻擊作為縱深防御措施,而將escaping作為首要防線。#p#

解碼(又稱為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的位置)插入數據,主要有兩種注入代碼的方式:#p#

Injecting UP,上行注入

最常見的方式是關閉現有的context并開始一個新的代碼context,例如,當你關閉HTML屬性時使用">并開始新的<SCRIPT>標簽。這種攻擊將關閉原始context(層次結構的上層部分),然后開始新的標簽允許腳本代碼執行。記住,當你試圖破壞現有context時你可以跳過很多層次結構的上層部分,例如</SCRIPT>可以終止腳本塊,即使該腳本塊被注入腳本內方法調用內的引用字符,這是因為HTML解析器在JavaScript解析器之前運行。

Injecting DOWN,下行注入

另一種不太常見的執行XSS注入的方式就是,在不關閉當前context的情況下,引入一個subcontext。例如,將<IMG src="...">改為<IMG src="javascript:alert(1)">,并不需要躲開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相分離。#p#

本文列出了最常見的插槽位置和安全放置數據的規則,基于各種不同的要求、已知的XSS載體和對流行瀏覽器的大量手動測試,我們保證本文提出的規則都是安全的。

定義好插槽位置,開發者們在放置任何數據前,都應該仔細分析以確保安全性。瀏覽器解析是非常棘手的,因為很多看起來無關緊要的字符可能起著重要作用。

為什么不能對所有不可信數據進行HTML實體編碼?

可以對放入HTML文檔正文的不可行數據進行HTML實體編碼,如<div>標簽內。也可以對進入屬性的不可行數據進行實體編碼,尤其是當屬性中使用引用符號時。但是HTML實體編碼并不總是有效,例如將不可信數據放入<script>標簽、事件處理器(如onmouseover) 、CSS內部或URL內等。即使你在每個位置都使用HTML實體編碼的方法,仍然不能抵御跨站腳本攻擊。對于放入不可信數據的HTML文檔部分,必須使用escape語法,這也是下面即將討論的問題。

你需要一個安全編碼庫

編寫編碼器并不是非常難,不過也有不少隱藏的陷阱。例如,你可能會使用一下解碼捷徑(JavaScsript 中的"),但是,這些很容易被瀏覽器中的嵌套解析器誤解,應該使用一個安全的專門解碼庫以確保這些規則能夠正確執行。

XSS防御規則

下列規則旨在防止所有發生在應用程序的XSS攻擊,雖然這些規則不允許任意向HTML文檔放入不可信數據,不過基本上也涵蓋了絕大多數常見的情況。你不需要采用所有規則,很多企業可能會發現第一條和第二條就已經足以滿足需求了。請根據自己的需求選擇規則。#p#

No.1 – 不要在允許位置插入不可信數據

第一條規則就是拒絕所有數據,不要將不可信數據放入HTML文檔,除非是下列定義的插槽。這樣做的理由是在理列有解碼規則的HTML中有很多奇怪的context,讓事情變得很復雜,因此沒有理由將不可信數據放在這些context中。

<script>...NEVERPUTUNTRUSTEDDATAHERE...</script> directlyinascript

<!--...NEVERPUTUNTRUSTEDDATAHERE...-->      insideanHTMLcomment

<div...NEVERPUTUNTRUSTEDDATAHERE...=test/>   inanattributename

<...NEVERPUTUNTRUSTEDDATAHERE...href="/test"/> inatagname

更重要的是,不要接受來自不可信任來源的JavaScript代碼然后運行,例如,名為“callback”的參數就包含JavaScript代碼段,沒有解碼能夠解決。

No.2 – 在向HTML元素內容插入不可信數據前對HTML解碼

這條規則適用于當你想把不可信數據直接插入HTML正文某處時,這包括內部正常標簽(div、p、b、td等)。大多數網站框架都有HTML解碼的方法且能夠躲開下列字符。但是,這對于其他HTML context是遠遠不夠的,你需要部署其他規則。

<body>...ESCAPEUNTRUSTEDDATABEFOREPUTTINGHERE... </body>

<div>...ESCAPEUNTRUSTEDDATABEFOREPUTTINGHERE...</div>

以及其他的HTML常用元素

使用HTML實體解碼躲開下列字符以避免切換到任何執行內容,如腳本、樣式或者事件處理程序。在這種規格中推薦使用十六進制實體,除了XML中5個重要字符(&、<、 >、 "、 ')外,還加入了斜線符,以幫助結束HTML實體。

&-->&

<--><

>-->>

"-->"

'-->'&apos;isnotrecommended

/-->/forwardslashisincludedasithelpsendanHTMLentity

ESAPI參考實施

Stringsafe=ESAPI.encoder().encodeForHTML(request.getParameter("input"));

#p#

No.3 – 在向HTML常見屬性插入不可信數據前進行屬性解碼

這條規則是將不可信數據轉化為典型屬性值(如寬度、名稱、值等),這不能用于復雜屬性(如href、src、style或者其他事件處理程序)。這是及其重要的規則,事件處理器屬性(為HTML JavaScript Data Values)必須遵守該規則。

<divattr=...ESCAPEUNTRUSTEDDATABEFOREPUTTINGHERE...>content</div>  insideUNquotedattribute

<divattr='...ESCAPEUNTRUSTEDDATABEFOREPUTTINGHERE...'>content</div> insidesinglequotedattribute

<divattr="...ESCAPEUNTRUSTEDDATABEFOREPUTTINGHERE...">content</div> insidedoublequotedattribute

除了字母數字字符外,使用小于256的ASCII值&#xHH格式(或者命名的實體)對所有數據進行解碼以防止切換屬性。這條規則應用廣泛的原因是因為開發者常常讓屬性保持未引用,正確引用的屬性只能使用相應的引用進行解碼。未引用屬性可以被很多字符破壞,包括[space] % * + , - / ; < = > ^ 和 |。

ESAPI參考實施

String safe = ESAPI.encoder().encodeForHTMLAttribute( request.getParameter( "input" ) );

No.4 – 在向HTML JavaScript Data Values插入不可信數據前,進行JavaScript解碼

這條規則涉及在不同HTML元素上制定的JavaScript事件處理器。向這些事件處理器放置不可信數據的唯一安全位置就是“data value”。在這些小代碼塊放置不可信數據是相當危險的,因為很容易切換到執行環境,因此請小心使用。

<script>alert('...ESCAPEUNTRUSTEDDATABEFOREPUTTINGHERE...')</script>  insideaquotedstring

<script>x=...ESCAPEUNTRUSTEDDATABEFOREPUTTINGHERE...</script>      onesideofanexpression

<divonmouseover=...ESCAPEUNTRUSTEDDATABEFOREPUTTINGHERE...</div>    insideUNquotedeventhandler

<divonmouseover='...ESCAPEUNTRUSTEDDATABEFOREPUTTINGHERE...'</div>   insidequotedeventhandler

<divonmouseover="...ESCAPEUNTRUSTEDDATABEFOREPUTTINGHERE..."</div>   insidequotedeventhandler

除了字母數字字符外,使用小于256的ASCII值xHH格式 對所有數據進行解碼以防止將數據值切換至腳本內容或者另一屬性。不要使用任何解碼捷徑(如" )因為引用字符可能被先運行的HTML屬性解析器相匹配。如果事件處理器被引用,則需要相應的引用來解碼。這條規則的廣泛應用是因為開發者經常讓事件處理器保持未引用。正確引用屬性只能使用相應的引用來解碼,未引用屬性可以使用任何字符(包括[space] % * + , - / ; < = > ^ 和|)解碼。同時,由于HTML解析器比JavaScript解析器先運行,關閉標簽能夠關閉腳本塊,即使腳本塊位于引用字符串中。

ESAPI參考實施

Stringsafe=ESAPI.encoder().encodeForJavaScript(request.getParameter("input"));

#p#

No.5 – 在向HTML 樣式屬性值插入不可信數居前,進行CSS解碼

當你想將不可信數據放入樣式表或者樣式標簽時,可以用此規則。CSS是很強大的,可以用于許多攻擊。因此,只能在屬性值中使用不可信數據而不能在其他樣式數據中使用。不能將不可信數據放入復雜的屬性(如url,、behavior、和custom (-moz-binding))。同樣,不能將不可信數據放入允許JavaScript的IE的expression屬性值。

<style>selector{property:...ESCAPEUNTRUSTEDDATABEFOREPUTTINGHERE...;}</style>  propertyvalue

<spanstyle=property:...ESCAPEUNTRUSTEDDATABEFOREPUTTINGHERE...;>text</style>    propertyvalue

除了字母數字字符外,使用小于256的ASCII值HH格式對所有數據進行解碼。不要使用任何解碼捷徑(如" )因為引用字符可能被先運行的HTML屬性解析器相匹配,防止將數據值切換至腳本內容或者另一屬性。同時防止切換至expression或者其他允許腳本的屬性值。如果屬性被引用,將需要相應的引用進行解碼,所有的屬性都應該被引用。未引用屬性可以使用任何字符(包括[space] % * + , - / ; < = > ^ 和|)解碼。同時,由于HTML解析器比JavaScript解析器先運行,</script>標簽能夠關閉腳本塊,即使腳本塊位于引用字符串中。

ESAPI參考實施

Stringsafe=ESAPI.encoder().encodeForCSS(request.getParameter("input"));

No.6- 在向HTML URL屬性插入不可信數據前,進行URL解碼

當你想將不可信數據放入鏈接到其他位置的link中時需要運用此規則。這包括href和src屬性。還有很多其他位置屬性,不過我們建議不要在這些屬性中使用不可信數據。需要注意的是在javascript中使用不可信數據的問題,不過可以使用上述的HTML JavaScript Data Value規則。

<ahref=http://...ESCAPEUNTRUSTEDDATABEFOREPUTTINGHERE...>link</a>    anormallink

<imgsrc='http://...ESCAPEUNTRUSTEDDATABEFOREPUTTINGHERE...'/>      animagesource

<scriptsrc="http://...ESCAPEUNTRUSTEDDATABEFOREPUTTINGHERE..."/>    ascriptsource

除了字母數字字符外,使用小于256的ASCII值%HH 解碼格式對所有數據進行解碼。在數據中保護不可信數據:URL不能夠被允許,因為沒有好方法來通過解碼來切換URL以避免攻擊。所有的屬性都應該被引用。未引用屬性可以使用任何字符(包括[space] % * + , - / ; < = > ^ 和|)解碼。 請注意實體編碼在這方面是沒用的。

ESAPI參考實施

Stringsafe=ESAPI.encoder().encodeForURL(request.getParameter("input"));

責任編輯:藍雨淚 來源: 2cto
相關推薦

2020-12-21 09:40:06

腳本攻擊XSS漏洞

2013-01-11 17:33:46

2017-06-14 16:08:31

2010-09-10 14:13:11

2010-06-07 20:19:49

2015-02-01 09:26:10

2012-04-12 14:45:13

2009-03-09 17:19:53

2013-10-29 09:51:33

2010-09-27 17:37:10

2012-11-09 15:42:44

2010-09-10 10:57:33

2013-07-26 14:59:13

2010-06-30 16:26:05

2009-02-24 17:19:38

2009-03-09 12:37:48

2018-10-11 15:20:02

2010-09-29 15:33:51

2010-09-09 11:19:10

2022-08-12 07:01:00

Node.jsXSS腳本
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久青草av | 日韩资源 | 久久久久亚洲精品 | 中文字幕av一区二区三区 | 懂色av一区二区三区在线播放 | 欧美日韩国产中文字幕 | 亚洲成人综合在线 | 午夜精品久久久久久久久久久久久 | 看片91| 色女人天堂 | 国产主播第一页 | 国产不卡一区 | 亚洲精品视频在线播放 | 欧美激情亚洲激情 | 青娱乐国产 | 3p视频在线观看 | 中文字幕精品一区二区三区精品 | 奇米超碰| www.日日操 | 国产精品国产三级国产播12软件 | 操到爽 | 国产香蕉视频在线播放 | 一区二区三区 在线 | 欧美一区二区网站 | 中国一级特黄视频 | 日韩成人一区 | 亚洲国产一区视频 | 欧美乱淫视频 | 欧美精| 久久久久久免费看 | 免费在线看a | 久久国产成人精品国产成人亚洲 | 欧美一区二不卡视频 | 成人三级视频 | 久久精品国产一区二区三区 | 精品视频一区二区三区在线观看 | 久久久久久免费精品一区二区三区 | 在线一级片 | 久久成人国产精品 | 欧美99| 我要看黄色录像一级片 |