面試題之XSS攻擊

XSS跨域腳本攻擊
原理
無需登錄認證,核心原理就是向你的頁面注入腳本。
1、反射型:發出請求時,XSS代碼出現在URL中,作爲輸入提交到服務器端,服務器端解析後響應,XSS代碼隨響應內容一起傳回給瀏覽器,最後瀏覽器解析執行XSS代碼。
2、存儲型:存儲型XSS和反射型XSS的差別僅在於,提交的代碼會存儲在服務端(數據庫,內存,文件系統等),下次請求目標頁面時不用再提交XSS代碼。(例如:常見的評論,在文本框中輸入一段代碼,那麼就會存放在數據庫當中,當再次加載的時候便會執行這樣的代碼)。
常見的場景
留言、評論、註冊、登錄等
攻擊示例
CSS攻擊
用戶上傳的style節點、script節點、iframe節點等,場景:比如用戶在上傳的過程中構建了一個style節點,裏面寫着body display:none !important,大家知道!important在CSS中的優先級最高,如果用戶上傳的裏面真有這樣的CSS的話,後果是什麼,後果就是任何包含這個CSS文件的頁面,用戶看到的都是空白頁面,因爲body是隱藏的,攻擊完成!
JavaScript攻擊
新浪博客寫一篇文章,同時偷偷插入一段script,然後發佈,發佈完成以後如果有人看了,那麼我們插入的script就會執行,攻擊代碼中獲取cookie(現在不常有了,個人信息一般會有手機號,郵箱等),接下來就會把查看着的cookie發送的攻擊者的服務器。

alert(document.cookie) // 這段代碼意思就是獲取cookie,那麼cookie中可能存在用戶的敏感信息


防禦
編碼,對用戶的輸入不能保持原樣,要進一步處理,對用戶輸入的數據進行HTML Entity編碼(十進制或轉義字符);
正則過濾,要把不安全或不合理的內容過濾掉,比如移除用戶上傳的DOM屬性,如onerror、onclick、onmousdown、替換script爲''等,除了在你的業務中有特殊需求的其它事件都要過濾掉;我們只需要把script的<>尖括號轉換了就可以了, 讓它形成不了JS的代碼塊,無法執行就可以了。
後端也可以替換;前端替換會影響性能

// 安裝一個插件
cnpm i xss -D
 
// 使用,在需要的地方引入
const xss = require('xss')
// xss其實是一個函數,只需要把創建博客時候的title及content包起來就可以了
const title = xss(blogData.title)
// 這樣的話title裏面的JS就被我們轉義了
 
// 轉義過後先顯示在前端頁面上就是轉義後的了,需要前端再次轉回去,這個交給前端來做,合格的後端不可能在數據庫存儲具有攻擊可能性的代碼。

 

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章