瀏覽器的同源策略限制了一些跨域行爲,但仍有些特例(img、iframe、script標籤)不受跨域限制,這就給XSS攻擊創造了機會(這徹底不是同源策略的鍋,必定是程序員的鍋)。html
在講下面的內容前,仍是要提一下Cookie,Cookie是用來辨別用戶身份的重要依據。來作個形象的比喻,有一天,小A去了一家新開的理髮店,店裏的託尼老師不認識小A,因而小A就辦了一張VIP卡,當小A第二次去這家理髮店的時候,店裏的託尼老師刷了下小A的卡,想起來了你是小A啊,今天搞什麼樣的造型啊~ Cookie就是那張VIP卡,用於辨別用戶身份。前端
Cookie包含如下幾個屬性jquery
採用 Name = Value 的鍵值對形式存儲數據,Name是惟一的程序員
Domain:域名,限制哪些域名下可使用(該VIP卡僅限本店使用)數據庫
Path:路徑,只有這個路徑前綴的纔可用(該VIP卡僅限燙頭)跨域
Expires:過時時間(該VIP卡有效期一年)瀏覽器
HTTP(HTTPOnly):只有瀏覽器請求時,纔會在請求頭中帶着,JavaScript沒法讀寫服務器
Secure:非HTTPS請求時不帶cookie
SameSite:用於定義cookie如何跨域發送app
Cookie就先簡單說到這裏,回到XSS攻擊,後續講到的XSS和CSRF攻擊都會圍繞着怎麼獲取Cookie來舉例。
XSS(Cross-site-Script跨站腳本攻擊),一般是帶有頁面可解析內容的數據未經處理直接插入到頁面上解析形成的。XSS根據攻擊腳本的引入位置來區分爲存儲型XSS、反射型XSS以及MXSS(也叫DOM XSS)三種。
根據上面的描述來舉個例子:
假設有一個論壇存在XSS漏洞,用戶小A在該論壇的一篇帖子中留言到
當小A寫的留言被該論壇保存下來以後,若是有其餘的用戶看到了這條評論(至關於打開了這個頁面,執行了hark.js,hark.js裏面內容大體是獲取Cookie,發送請求),那麼這些用戶的Cookie都會發送到小A事先寫好的信息收集網站中進行保存,而後小A就能夠用這些Cookie進行登陸啦。
上述這種XSS攻擊屬於存儲型,提交的代碼會被存儲在服務器端,下次請求目標網站時不用再提交XSS代碼。因此這種類型的主要緣由是前端提交的數據未經處理直接存儲到數據庫,而後從數據庫中讀取出來後直接插入到頁面中致使的。
繼續講故事:
假設有一個網站lalala存在XSS漏洞,網址是http://www.lalala.com。而後有一天小A在郵件裏發現一封郵件,內容是一張你懂得圖片而後配下面的標籤。
小A好奇啊,而後就點了進去,若是在此以前小A登陸過lalala網站,那麼他的Cookie就被盜走了。
這種XSS攻擊屬於反射型,發出請求時,XSS代碼出如今URL中,做爲輸入提交到服務器,服務器解析後響應,XSS代碼隨着響應內容一塊兒傳回給瀏覽器,最後瀏覽器解析執行XSS代碼。這個過程像一次反射,故叫作反射型XSS。
MXSS則是在渲染DOM屬性時將攻擊腳本插入DOM屬性中被解析而致使的。
至此,三種類型的XSS攻擊都描述完了,你看確實都是程序員的鍋吧。
服務端能夠作如下動做:
一、剛剛上面講到Cookie中有個屬性時HTTP,設置爲True,不容許JavaScript讀取cookies,但該屬性只適配部分瀏覽器。對於HTTPS能夠設置Secure
二、處理富文本框輸入內容,進行XSS過濾,過濾相似script、iframe、form等標籤以及轉義存儲
客戶端能夠作如下動做:
一、輸入檢查,和服務端同樣都要作。
二、輸出檢查,編碼轉義,若是使用jquery,就是那些append、html、before、after等,插入DOM的方法須要注意。現今大部分的MV*框架在模板(view層)會自動處理XSS問題。
XSS攻擊的危害是很大的,像上面的例子注入script能夠執行任何的JS代碼(意味着能夠獲取cookie等信息了),注入style能夠把頁面所有弄崩。尤爲是具備評論功能的網站須要注意防範此類攻擊,不要相信客戶端發送過來的任何數據!還有就是不要亂點開奇奇怪怪的連接啦~