XSS的兩種攻擊方式及五種防御方式

XSS介紹

跨站腳本攻擊指的是自己的網(wǎng)站運(yùn)行了別的網(wǎng)站里面的代碼
攻擊原理是原本需要接受數(shù)據(jù)但是一段腳本放置在了數(shù)據(jù)中:



該攻擊方式能做什么者祖?

  • 獲取頁(yè)面數(shù)據(jù)
  • 獲取Cookies
  • 劫持前端邏輯
  • 發(fā)送請(qǐng)求到攻擊者自己的網(wǎng)站實(shí)現(xiàn)資料的盜取
  • 偷取網(wǎng)站任意數(shù)據(jù)
  • 偷取用戶密碼和登陸狀態(tài)
  • 改變按鈕的邏輯

XSS攻擊類型

其實(shí)XSS的種類非常的多尤其是變種的特別多翰舌,大致可以分為兩種
反射型:是通過(guò)URL參數(shù)直接注入,一般是使用alert來(lái)探測(cè)站點(diǎn)是否防御,直接攻擊的使用src來(lái)引入自己的腳本

http://localhost:1521/?from=<script>alert(1)</script>bing

存儲(chǔ)型:存儲(chǔ)到DB后讀取時(shí)注入(危害很大)
在評(píng)論的時(shí)候?qū)憇cript標(biāo)簽,這樣數(shù)據(jù)就是存儲(chǔ)在數(shù)據(jù)庫(kù)中的,如果該頁(yè)面要讀取出這條有script標(biāo)簽的信息那么將這個(gè)網(wǎng)址發(fā)給別人別人也會(huì)中招驰贷。

XSS攻擊注入點(diǎn):

html節(jié)點(diǎn)內(nèi)容:如果一個(gè)節(jié)點(diǎn)是動(dòng)態(tài)生成的,有可能這個(gè)節(jié)點(diǎn)的數(shù)據(jù)有腳本(用戶輸入信息)

html屬性:某個(gè)html的屬性是由用戶輸入的洛巢,輸入的內(nèi)容可能有腳本

<img src="1" onerror="alert(1)"/>
1" onerror="alert(1) // src被提前關(guān)閉

js代碼:js代碼中存在后臺(tái)注入的變量或者用戶輸入的信息

localhost:1521/?from=google";alert(1);"

富文本:其實(shí)是一大段的html括袒,我們需要保留格式又要去掉script標(biāo)簽,這是比較麻煩的

富文本得保留HTML稿茉,HTML有XSS就有攻擊風(fēng)險(xiǎn)
實(shí)際上瀏覽器有著XSS的部分防御機(jī)制锹锰,可以通過(guò)

ctx.set('X-XSS-Protection',0); // 0-disable 1-enable

來(lái)進(jìn)行關(guān)閉,瀏覽器的防御很有限漓库,只能是反射型的參數(shù)并且出現(xiàn)在html節(jié)點(diǎn)和屬性中才會(huì)進(jìn)行防御恃慧,在js和富文本中是不會(huì)攔截的。

五種防御方式

HTML節(jié)點(diǎn)內(nèi)容的XSS防御
轉(zhuǎn)義掉<<和>> 即轉(zhuǎn)義掉<>即可渺蒿,轉(zhuǎn)義的時(shí)機(jī)有兩種痢士,一種是寫入數(shù)據(jù)庫(kù)的時(shí)候進(jìn)行轉(zhuǎn)義,另一種實(shí)在解析的時(shí)候進(jìn)行轉(zhuǎn)義茂装。

這里是在顯示的時(shí)候轉(zhuǎn)義

var escapeHtml = function(str){
  str = str.replace(/>/g, '&lt;');
  str = str.replace(/>/g, '&gt;');
  return str;
}
 
escapeHtml(content);

HTML屬性的XSS防御
轉(zhuǎn)義”&quto; 即轉(zhuǎn)義掉雙引號(hào)怠蹂,'轉(zhuǎn)義掉單引號(hào)善延,(另一個(gè)要注意的是實(shí)際上html的屬性可以不包括引號(hào),因此嚴(yán)格的說(shuō)我們還需要對(duì)空格進(jìn)行轉(zhuǎn)義城侧,但是這樣會(huì)導(dǎo)致渲染的時(shí)候空格數(shù)不對(duì)易遣,因此我們不轉(zhuǎn)義空格,然后再寫html屬性的時(shí)候全部帶上引號(hào))這樣屬性就不會(huì)被提前關(guān)閉了

var escapeHtmlProperty = function(str){
  str = str.replace(/"/g, '&quto;');
  str = str.replace(/'/g, '&#39;');
  str = str.replace(/ /g, '&#32;');
  return str;
}
 
escapeHtml(content);

其實(shí)以上這兩個(gè)函數(shù)可以合并成一個(gè)函數(shù)嫌佑,這樣不管是內(nèi)容還是屬性都可以使用一個(gè)函數(shù)來(lái)過(guò)濾了:

HTML轉(zhuǎn)義函數(shù)

var escapeHtmlProperty = function(str){
  if(!str) return '';
  str = str.replace(/&/g, '&amp;');
  str = str.replace(/>/g, '&lt;'); 
  str = str.replace(/>/g, '&gt;');
  str = str.replace(/"/g, '&quto;');
  str = str.replace(/'/g, '&#39;');
  return str;
}
 
escapeHtml(content);

js轉(zhuǎn)義

轉(zhuǎn)義”\”或者替換成json

var escapeForJs = function(str){
 if(!str) return '';
 str = str.replace(/\\/g,'\\\\');
 str = str.replace(/"/g,'\\"');
}

這里的解決方式并不完整豆茫,因?yàn)檫€有可能是單引號(hào)或者其他形勢(shì)包裹的,這里最保險(xiǎn)的方法其實(shí)很簡(jiǎn)單屋摇,就是對(duì)數(shù)據(jù)做一次JSON.stringify即可

富文本

由于需要完整的HTML因此不太容易過(guò)濾澜薄,一般是按照白名單進(jìn)行保留部分標(biāo)簽和屬性來(lái)進(jìn)行過(guò)濾,除了允許的標(biāo)簽和屬性摊册,其他的全部不允許(也有黑名單的方式,但是由于html復(fù)雜效果比較差颊艳,原理就是之前的正則替換)

其實(shí)可以用別人寫好的XSS組件就叫做xss茅特,直接

npm install xss

白名單-使用第三方庫(kù)XSS,支持指定白名單

var xssFilter = function(html){
    if(!html) return '';
 
    var xss = require('xss');
    var ret = xss(html, {
        whiteList:{
            img: ['src'],
            a: ['href'],
            font: ['size', 'color']
        },
        onIgnoreTag: function(){
            return '';
        }
    });
 
 
    console.log(html, ret);
 
    return ret;
};

本文作者熊冰棋枕,個(gè)人網(wǎng)站Bing的天涯路白修,轉(zhuǎn)載請(qǐng)注明出處。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
禁止轉(zhuǎn)載重斑,如需轉(zhuǎn)載請(qǐng)通過(guò)簡(jiǎn)信或評(píng)論聯(lián)系作者兵睛。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市窥浪,隨后出現(xiàn)的幾起案子祖很,更是在濱河造成了極大的恐慌,老刑警劉巖漾脂,帶你破解...
    沈念sama閱讀 219,188評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件假颇,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡骨稿,警方通過(guò)查閱死者的電腦和手機(jī)笨鸡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)坦冠,“玉大人形耗,你說(shuō)我怎么就攤上這事≌藁耄” “怎么了激涤?”我有些...
    開(kāi)封第一講書人閱讀 165,562評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)例衍。 經(jīng)常有香客問(wèn)我昔期,道長(zhǎng)已卸,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 58,893評(píng)論 1 295
  • 正文 為了忘掉前任硼一,我火速辦了婚禮累澡,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘般贼。我一直安慰自己愧哟,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,917評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布哼蛆。 她就那樣靜靜地躺著蕊梧,像睡著了一般。 火紅的嫁衣襯著肌膚如雪腮介。 梳的紋絲不亂的頭發(fā)上肥矢,一...
    開(kāi)封第一講書人閱讀 51,708評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音叠洗,去河邊找鬼甘改。 笑死,一個(gè)胖子當(dāng)著我的面吹牛灭抑,可吹牛的內(nèi)容都是我干的十艾。 我是一名探鬼主播,決...
    沈念sama閱讀 40,430評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼腾节,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼忘嫉!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起案腺,我...
    開(kāi)封第一講書人閱讀 39,342評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤庆冕,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后救湖,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體愧杯,經(jīng)...
    沈念sama閱讀 45,801評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,976評(píng)論 3 337
  • 正文 我和宋清朗相戀三年鞋既,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了力九。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,115評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡邑闺,死狀恐怖跌前,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情陡舅,我是刑警寧澤抵乓,帶...
    沈念sama閱讀 35,804評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響灾炭,放射性物質(zhì)發(fā)生泄漏茎芋。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,458評(píng)論 3 331
  • 文/蒙蒙 一蜈出、第九天 我趴在偏房一處隱蔽的房頂上張望田弥。 院中可真熱鬧,春花似錦铡原、人聲如沸偷厦。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,008評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)只泼。三九已至,卻和暖如春卵洗,著一層夾襖步出監(jiān)牢的瞬間请唱,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,135評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工过蹂, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留籍滴,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,365評(píng)論 3 373
  • 正文 我出身青樓榴啸,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親晚岭。 傳聞我的和親對(duì)象是個(gè)殘疾皇子鸥印,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,055評(píng)論 2 355