什麼是XSS? javascript
xss是惡意用戶將腳本植入到頁面中執行而獲取相應敏感信息。也就是會在web頁面某個節點(文本節點、屬性節點)運行。
html
XSS攻擊的危害包括:前端
1.盜用帳號等敏感信息java
2.非法轉帳等web
XSS攻擊類型:數據庫
1.反射型。經過一個假裝的url連接進行攻擊,利用url的search參數將腳本假裝,當頁面獲取連接參數進行攻擊後端
2.儲存型。經過表單輸入,儲存數據庫,再在頁面讀取數據,回顯執行腳本進行攻擊。cookie
3.富文本。xss
注入點:函數
1.html節點內容
評價輸入框輸入存儲DB後讀取
<div> {content} </div>
<div> <script></script></div>
2.html屬性
URL傳入src,scr提早關閉引號
<img src='#{img}' />
<img src="1" onerror="alert(1)" />
3.腳本
提早關閉引號
<script>
var data = '#{data}'
var data = 'hello';alert(0)''
</script>
4.富文本編輯
本質是一段複雜的html,提交
XSS防護
1.針對反射型
2.針對html的腳本注入
//html節點 防護 //對於尖括號「<」 ">" 進行轉義 //轉義時機: 在存入數據庫前 或 在讀取DB展現前轉義 function escapeHtml(str){ str = str.replace(/&/g, '&'); //這句在先,否則會把<的&符號也轉了 str = str.replace(/</g, '<'); str = str.replace(/>/g, '>'); return str } //html屬性 防護 //對於引號 「"」 進行轉義 function escapeHtmlProp(str){ if(!str) return '' str = str.replace(/"/g, '&quto;'); str = str.replace(/'/g, '''); str = str.replace(/ /g, ' '); return str } //以上兩種防護方法能夠合併爲同一個函數方法
3.針對JS的腳本注入
直接用JSON.stringify(str)
4.針對富文本的腳本注入
1)白名單
var xssfilter = function (html){ if(!html) return; var cheerio = require('cheerio'); var $ = cheerio.load(html); //設置白名單 var whiteList = { 'img': ['src','title'] } $('*').each(function(index,el){ if(!whiteList[el.name]){ $(el).remove(); return; } for( var attr in el.attribs) { if(whiteList[el.name].indexOf(attr) === -1){ $(el).attr(attr,null) } } }) return html }
2)黑名單
1.攻擊原理
用戶登陸正常A網站進行正常操做,而且確認身份,保存認證信息。而後惡意網站B頁面向A網站發起請求(帶上A網站的認證身份),以達到在A網站執行惡意操做。
2.危害
利用用戶登陸態 盜取用戶資金
用戶不知情 冒充用戶發帖
完成業務請求 損壞網站聲譽
3.防護
從關鍵點切入:惡意網站向認證網站發請求,帶上認證信息。
1.禁止第三方網站帶cookie。
後端設置samesite值
2.不訪問認證網站
在前端頁面加入驗證信息
驗證碼
token