狠狠色丁香婷婷综合尤物/久久精品综合一区二区三区/中国有色金属学报/国产日韩欧美在线观看 - 国产一区二区三区四区五区tv

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發文檔 其他文檔  
 
網站管理員

[點晴永久免費OA]XSS攻擊的解決方法

admin
2020年4月8日 15:4 本文熱度 3270

在我上一篇《前端安全之XSS攻擊》文中,并沒有把XSS攻擊的解決辦法說完整,而XSS的攻擊又那么五花八門,有沒有一招“獨孤九劍”能夠抗衡,畢竟那么多情況場景,開發人員無法一一照顧過來,而今天通過閱讀《白帽子講Web安全》這本書,對應對方式有了更好的總結,分為兩類,一是服務端可以干的事,二是客戶端可以干的事。

前提

在說XSS解決方式時,有一個前提。就是同源策略——瀏覽器的同源策略(瀏覽器安全的基礎,即使是攻擊腳本也要遵守這法則),限制了來自不同源的“document”或腳本,對當前“document”讀取或設置某些屬性。除了DOM、Cookie、XMLHttpRequest會受到同源策略的限制外,瀏覽器加載的一些第三方插件也有各自的同源策略。不過script、img、iframe、link等標簽都可以跨域加載資源,而不受同源策略的限制。

服務端可以干的事

1. HttpOnly

其實就是現在HTTP協議(HTTPS也是可以的)才能讀取cookies,JavaScript是讀取不到cookies的。支持瀏覽器是IE6+、Firefox2+、Google、Safari4+。

JavaEE給Cookie添加HttpOnly的代碼:

response.setHeader("Set-Cookie","cookiename=value; Path=/;Domain=domainvalue;Max-Age=seconds;HTTPOnly");

PS:對于HTTPS,還是可以設置Secure字段,對Cookie進行安全加密。

這是本質上不是預防XSS,而是在被攻破時候不允許JS讀取Cookie。

2.處理富文本

有些數據因為使用場景問題,并不能直接在服務端進行轉義存儲。不過富文本數據語義是完整的HTML代碼,在輸出時也不會拼湊到某個標簽的屬性中,所以可以當特殊情況特殊處理。處理的過程是在服務端配置富文本標簽和屬性的白名單,不允許出現其他標簽或屬性(例如script、iframe、form等),即”XSS Filter“。然后在存儲之前進行過濾(過濾原理沒有去探明)。

Java有個開源項目Anti-Samy是非常好的XSS Filter:

Policy ploicy = Policy.getInstance(POLICY_FILE_LOCATION);
	AntiSamy as = new AntiSamy();
	CleanResults cr = as.scan(dirtyInput, policy);
	MyUserDao.storeUserProfile(cr.getCleanHTML());

PS:當然也可以在前端顯示前過濾,但是我覺得,讓前端人員少做東西好,并且服務端只需要轉一次。

客戶端可以干的事

1. 輸入檢查

輸入檢查的邏輯,必須放在服務器端代碼中實現(因為用JavaScript做輸入檢查,很容易被攻擊者繞過)。目前Web開發的普遍做法,是同時在客戶端JavaScript中和服務器代碼中實現相同的輸入檢查??蛻舳薐avaScript的輸入檢查,可以阻擋大部分誤操作的正常用戶,從而節約服務資源。

PS:簡單說,就是輸入檢查,服務端和客戶端都要做。

另外攻擊者可能輸入XSS的地方,例如:

1.頁面中所有的input框
	2.window.location(href、hash等)
	3.window.name
	4.document.referrer
	5.document.cookie
	6.localstorage
	7.XMLHttpRequest返回的數據

PS:當然不止這些

2. 輸出檢查

一般就是在變量輸出到HTML頁面時,使用編碼或轉義的方式來防御XSS攻擊。XSS的本質就是“HTML注入”,用戶的數據被當成了HTML代碼一部分來執行,從而混淆了原本的語義,產生了新的語義。

觸發XSS的地方

1.document.write
	2.xxx.innerHTML=
	3.xxx.outerHTML=
	4.innerHTML.replace
	5.document.attachEvent
	6.window.attachEvent
	7.document.location.replace
	8.document.location.assign

PS:如果使用jquery,就是那些append、html、before、after等,其實就是拼接變量到HTML頁面時產生。大部分的MVC框架在模板(view層)會自動處理XSS問題,例如AngularJS。

用什么編碼轉義

主要有HTMLEncode和JavaScriptEncode這兩個,客戶端和服務端都能做。但是讓后端去做,我感覺是不大靠譜的,因為數據的使用場景可能有幾種,可以在標簽、屬性、或腳本里(甚至其他終端使用),單單以一種方式去encode是很極限的。

1.HTMLEncode,就是將字符轉換成HTMLEntities,一般會轉(&、<、>、"、''、/)這6個字符。

2.JavaScriptEncode,是使用”\“對特殊字符進行轉義。

PS:我在《HtmlEncode和JavaScriptEncode(預防XSS)》一文總結了比較完整的HTMLEncode和JavaScriptEncode兩個前端函數的寫法,以及一點示例。

哪些地方需要編轉義

1.在HTML標簽、屬性中輸出——用HTMLEncode

2.在script標簽中輸出——用JavaScriptEncode

3.在事件中輸出——用JavaScriptEncode

<a href="#" onclick="funcA(''$var'')">test</a>

4.在CSS中輸出

用類似JavaScriptEncode的方式。將除了字母、數字外的所有字符都編碼成十六進制形式”\uHH“。

5.在地址中輸出

一般如果變量是整個URL,則先檢查變量是否以“http”開頭(不是則幫忙添加http),保證不會出現偽協議類的XSS攻擊。然后再對變量進行URLEncode。

PS:URLEncode會將字符轉換成”%HH“形式。

總結

前端開發人員要注意在正確的地方使用正確的編碼方式,有時為了防御XSS,在一個地方我們需要聯合HTMLEncode、JavaScriptEncode進行編碼,甚至是疊加,并不是固定一種方式編碼(又是具體情況具體分析)。

一般存儲型XSS風險高于反射型XSS。反射型XSS一般要求攻擊者誘使用戶點擊一個包含XSS代碼的URL鏈接;而存儲型只需要用戶查看一個正常的URL鏈接,當用戶打開頁面時,XSS Payload就會被執行。這樣漏洞極其隱蔽,且埋伏在用戶的正常業務中,風險很高。(引自白帽子講Web安全原文)

本文為原創文章,轉載請保留原出處,方便溯源,如有錯誤地方,謝謝指正。

本文地址 :http://www.cnblogs.com/lovesong/p/5223989.html


該文章在 2020/4/8 15:04:50 編輯過
關鍵字查詢
相關文章
正在查詢...
點晴ERP是一款針對中小制造業的專業生產管理軟件系統,系統成熟度和易用性得到了國內大量中小企業的青睞。
點晴PMS碼頭管理系統主要針對港口碼頭集裝箱與散貨日常運作、調度、堆場、車隊、財務費用、相關報表等業務管理,結合碼頭的業務特點,圍繞調度、堆場作業而開發的。集技術的先進性、管理的有效性于一體,是物流碼頭及其他港口類企業的高效ERP管理信息系統。
點晴WMS倉儲管理系統提供了貨物產品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質期管理,貨位管理,庫位管理,生產管理,WMS管理系統,標簽打印,條形碼,二維碼管理,批號管理軟件。
點晴免費OA是一款軟件和通用服務都免費,不限功能、不限時間、不限用戶的免費OA協同辦公管理系統。
Copyright 2010-2025 ClickSun All Rights Reserved