自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

十面埋伏? 程序世界里的不信任原則

開(kāi)發(fā) 前端
人與人之間最重要的是信任,但程序的世界里,可能信任越少越好;我越發(fā)覺(jué)得越是高性能高可用的系統(tǒng)里,不信任原則會(huì)體現(xiàn)得更加淋漓盡致。 為了少走彎路,寫下這篇文章留給自己參考,其中一些是自己踩過(guò)的一些坑;一些是接手他人系統(tǒng)時(shí)觸過(guò)的雷;還有一些是從別人分享的經(jīng)驗(yàn)學(xué)習(xí)得來(lái);能力有限,先記下自己的一些體會(huì),錯(cuò)誤的地方再慢慢改正。

導(dǎo)語(yǔ)

人與人之間最重要的是信任,但程序的世界里,可能信任越少越好;我越發(fā)覺(jué)得越是高性能高可用的系統(tǒng)里,不信任原則會(huì)體現(xiàn)得更加淋漓盡致。 為了少走彎路,寫下這篇文章留給自己參考,其中一些是自己踩過(guò)的一些坑;一些是接手他人系統(tǒng)時(shí)觸過(guò)的雷;還有一些是從別人分享的經(jīng)驗(yàn)學(xué)習(xí)得來(lái);能力有限,先記下自己的一些體會(huì),錯(cuò)誤的地方再慢慢改正。

程序世界里的不信任原則

一、編程的世界里十面埋伏

編程,是一件容易的事,也是一件不容易的事。說(shuō)它容易,是因?yàn)檎莆找恍┗镜臄?shù)據(jù)類型和條件語(yǔ)句,就可以實(shí)現(xiàn)復(fù)雜的邏輯;說(shuō)它不容易,是因?yàn)楦咝阅芨呖捎玫拇a,需要了解的知識(shí)有很多很多;編程的世界,也跟掃雷游戲的世界一樣,充滿雷區(qū),十面埋伏,一不小心,隨時(shí)都可能踩雷,隨時(shí)都可能Game Over。

程序世界里的不信任原則

而玩過(guò)掃雷的人都知道,避免踩雷的最好方法,就是提前識(shí)別雷區(qū)并做標(biāo)記(設(shè)防)避免踩踏。

程序世界里的不信任原則

鑒于此,編程的世界里,從輸入到輸出同樣需要處處設(shè)防,步步為營(yíng)。

1、對(duì)輸入的不信任

(1)對(duì)空指針的檢查

不只是輸入,只有是使用到指針的地方,都應(yīng)該先判斷指針是否為NULL,而內(nèi)存釋放后,應(yīng)當(dāng)將指針設(shè)置為NULL。

【真實(shí)案例】:注冊(cè)系統(tǒng)某段邏輯,正常使用情況下,都有對(duì)指針做檢查,在某個(gè)錯(cuò)誤分支,打印日志時(shí),沒(méi)檢查就使用了該字符串;結(jié)果可正常運(yùn)行,但當(dāng)訪問(wèn)某個(gè)依賴模塊超時(shí)走到改分支,觸發(fā)bug,導(dǎo)致coredump。

(2)對(duì)數(shù)據(jù)長(zhǎng)度的檢查

使用字符串或某段buf,特別是memcpy/strcpy時(shí),需要盡量對(duì)數(shù)據(jù)長(zhǎng)度做下檢查和截?cái)唷?/p>

【真實(shí)案例】:接手oauth系統(tǒng)后運(yùn)行數(shù)月表現(xiàn)良好,突然有一天,發(fā)生了coredump,經(jīng)查,是某個(gè)業(yè)務(wù)不按規(guī)定請(qǐng)求包中填寫了超長(zhǎng)長(zhǎng)度,導(dǎo)致memcpy時(shí)發(fā)生段錯(cuò)誤,根本原因,還是沒(méi)有做好長(zhǎng)度檢查。

(3)對(duì)數(shù)據(jù)內(nèi)容的檢查

某些場(chǎng)景下,沒(méi)有對(duì)數(shù)據(jù)內(nèi)容做檢查就直接使用,可能導(dǎo)致意想不到的結(jié)果。

【案例】:sql注入和xss攻擊都是利用了服務(wù)端沒(méi)有對(duì)數(shù)據(jù)內(nèi)容做檢查的漏洞。

2、對(duì)輸出(變更)的不信任

變更的影響一般體現(xiàn)在輸出,有時(shí)候輸出的結(jié)果并不能簡(jiǎn)單的判斷是否正常,如輸出是加密信息,或者輸出的內(nèi)容過(guò)于復(fù)雜。

所以,對(duì)于每次變更

(1)修改代碼時(shí),采用不信任編碼,正確的不一定是“對(duì)”的,再小的修改也應(yīng)確認(rèn)其對(duì)后續(xù)邏輯的影響,有些修正可能改變?cè)瓉?lái)錯(cuò)誤時(shí)的輸出,而輸出的改變,就會(huì)影響到依賴該改變字段的業(yè)務(wù)。

(2)發(fā)布前,應(yīng)該對(duì)涉及到的場(chǎng)景進(jìn)行測(cè)試和驗(yàn)證,測(cè)試可以有效的發(fā)現(xiàn)潛在的問(wèn)題,這是眾所周知的。

(3)發(fā)布過(guò)程,應(yīng)該采用灰度發(fā)布策略,因?yàn)闇y(cè)試并非總是能發(fā)現(xiàn)問(wèn)題,灰度發(fā)布,可以減少事故影響的范圍。常見(jiàn)灰度發(fā)布的策略有機(jī)器灰度、IP灰度、用戶灰度、按比例灰度等,各有優(yōu)缺點(diǎn),需要根據(jù)具體場(chǎng)景選擇,甚至可以同時(shí)采用多種的組合。

(4)發(fā)布后,全面監(jiān)控是有效發(fā)現(xiàn)問(wèn)題的一種方法。因?yàn)闇y(cè)試環(huán)境和正式環(huán)境可能存在不一致的地方,也可能測(cè)試不夠完整,導(dǎo)致上線后有問(wèn)題,所以需采取措施補(bǔ)救

  • A:如使用Monitor監(jiān)控請(qǐng)求量、成功量、失敗量、關(guān)鍵節(jié)點(diǎn)等
  • B:使用DLP告警監(jiān)控成功率
  • C:發(fā)布完,在正式環(huán)境測(cè)試一遍

【案例】oauth系統(tǒng)某次修改后編譯時(shí),發(fā)現(xiàn)有個(gè)修改不相關(guān)的局部變量未初始化的告警,出于習(xí)慣對(duì)變量進(jìn)行了初始化(初始化值和編譯器默認(rèn)賦值不一樣),而包頭某個(gè)字段采用了該未初始化的變量,但在測(cè)試用例中未能體現(xiàn),監(jiān)控也沒(méi)細(xì)化到每個(gè)字段的值,導(dǎo)致測(cè)試正常,監(jiān)控正常;但前端業(yè)務(wù)齊齊互動(dòng)使用了該包頭字段,導(dǎo)致發(fā)布后影響該業(yè)務(wù)。

二、服務(wù)程序的世界里防不勝防

一般的系統(tǒng),都會(huì)有上下游的存在,正如下圖所示

程序世界里的不信任原則

而上下游的整個(gè)鏈路中,每個(gè)點(diǎn)都是不能保證絕對(duì)可靠的,任何一個(gè)點(diǎn)都可能隨時(shí)發(fā)生故障,讓你措手不及。

因此,不能信任整個(gè)鏈路中的任何一個(gè)點(diǎn),需進(jìn)行設(shè)防。

1、對(duì)服務(wù)本身的不信任

主要措施如下:

(1)服務(wù)監(jiān)控

前面所述的請(qǐng)求量、成功量、失敗量、關(guān)鍵節(jié)點(diǎn)、成功率的監(jiān)控,都是對(duì)服務(wù)環(huán)節(jié)的單點(diǎn)監(jiān)控。

在此基礎(chǔ)上,可以加上自動(dòng)化測(cè)試,自動(dòng)化測(cè)試可以模擬應(yīng)用場(chǎng)景,實(shí)現(xiàn)對(duì)于流程的監(jiān)控。

(2)進(jìn)程秒起

人可能在程序世界里是不可靠的因素(大牛除外),前面的措施,多是依賴人來(lái)保證的;所以,coredump還是有可能發(fā)生的,這時(shí),進(jìn)程秒起的實(shí)現(xiàn),就可以有效減少coredump的影響,繼續(xù)對(duì)外提供服務(wù)。

2、對(duì)依賴系統(tǒng)的不信任

可采用柔性可用策略,對(duì)于根據(jù)模塊的不可或缺性,區(qū)分關(guān)鍵路徑和非關(guān)鍵路徑,并采取不同的策略

(1)對(duì)于非關(guān)鍵路徑,采用柔性放過(guò)策略

當(dāng)訪問(wèn)非關(guān)鍵路徑超時(shí)時(shí),簡(jiǎn)單的可采取有限制(一定數(shù)量、一定比重)的重試,結(jié)果超時(shí)則跳過(guò)該邏輯,進(jìn)行下一步;復(fù)雜一點(diǎn)的統(tǒng)計(jì)一下超時(shí)的比例,當(dāng)比例過(guò)高時(shí),則跳過(guò)該邏輯,進(jìn)行下一步

(2)對(duì)于關(guān)鍵路徑,提供弱化服務(wù)的柔性策略

關(guān)鍵路徑是不可或缺的服務(wù),不能跳過(guò);某些場(chǎng)景,可以根據(jù)目的,在關(guān)鍵路徑嚴(yán)重不可用時(shí),提供弱化版的服務(wù)。舉例如派票系統(tǒng)訪問(wèn)票據(jù)存儲(chǔ)信息嚴(yán)重不可用時(shí),可提供不依賴于存儲(chǔ)的純算法票據(jù),為彌補(bǔ)安全性的確實(shí),可采取縮短票據(jù)有效期等措施。

3、對(duì)請(qǐng)求的不信任

(1)對(duì)請(qǐng)求來(lái)源的不信任

有利可圖的地方,就會(huì)有黑產(chǎn)時(shí)刻盯著,偽造各種請(qǐng)求,對(duì)此,可采取如下措施

A:權(quán)限控制

如ip鑒權(quán)、模塊鑒權(quán)、白名單、用戶登錄態(tài)校驗(yàn)等

B:安全審計(jì)

權(quán)限控制僅能打擊一下非正常流程的請(qǐng)求,但壞人經(jīng)常能夠成功模擬用戶正常使用的場(chǎng)景;所以,對(duì)于一些重要場(chǎng)景,需要加入安全策略,打擊如IP、號(hào)碼等信息聚集,頻率過(guò)快等機(jī)器行為,請(qǐng)求重放、劫持等請(qǐng)求)

(2)對(duì)請(qǐng)求量的不信任

前端的請(qǐng)求,不總是平穩(wěn)的;有活動(dòng)時(shí),會(huì)暴漲;前端業(yè)務(wù)故障恢復(fù)后,也可能暴漲;前端遭到惡意攻擊時(shí),也可能暴漲;一旦請(qǐng)求量超過(guò)系統(tǒng)負(fù)載,將會(huì)發(fā)生雪崩,最終導(dǎo)致整個(gè)服務(wù)不可用,對(duì)此種種突發(fā)情況,后端服務(wù)需要有應(yīng)對(duì)措施

  • A:頻率限制,控制各個(gè)業(yè)務(wù)的最大請(qǐng)求量(業(yè)務(wù)根據(jù)正常請(qǐng)求峰值的2-3倍申請(qǐng),該值可修改),避免因一個(gè)業(yè)務(wù)暴漲影響所有業(yè)務(wù)的情況發(fā)生。
  • B:過(guò)載保護(hù),雖然有頻率限制,但業(yè)務(wù)過(guò)多時(shí),依然有可能某個(gè)時(shí)間點(diǎn),所有的請(qǐng)求超過(guò)了系統(tǒng)負(fù)載,或者到某個(gè)IDC,某臺(tái)機(jī)器的請(qǐng)求超過(guò)負(fù)載,為避免這種情況下發(fā)生雪崩,將超過(guò)一定時(shí)間的請(qǐng)求丟棄,僅處理部分有效的請(qǐng)求,使得系統(tǒng)對(duì)外表現(xiàn)為部分可用,而非完全不可用。

三、運(yùn)營(yíng)的世界里不可預(yù)測(cè)

程序世界里的不信任原則

1、對(duì)機(jī)器的不信任

機(jī)器故障時(shí)有發(fā)生,如果服務(wù)存在單點(diǎn)問(wèn)題,故障時(shí),則服務(wù)將完全不可用,而依賴人工的恢復(fù)是不可預(yù)期的,對(duì)此,可通過(guò)以下措施解決

(1)容災(zāi)部署

即至少有兩臺(tái)以上的機(jī)器可以隨時(shí)對(duì)外提供服務(wù)。

(2)心跳探測(cè)

用于監(jiān)控機(jī)器是否可用,當(dāng)機(jī)器不可用時(shí),若涉及到主備機(jī)器的,應(yīng)做好主備機(jī)器的自動(dòng)切換;若不涉及到主備的,禁用故障機(jī)器對(duì)外提供服務(wù)即可。

2、對(duì)機(jī)房的不信任

現(xiàn)實(shí)生活中,整個(gè)機(jī)房不可用也是有發(fā)生過(guò)的,如2015年的天津?yàn)I海新區(qū)爆炸事故,導(dǎo)致騰訊在天津的多個(gè)機(jī)房不能對(duì)外提供正常服務(wù),對(duì)此采取的措施有:

(1)異地部署

不同IDC、不同城市、不同國(guó)家等部署,可用避免整個(gè)機(jī)房不可用時(shí),有其他機(jī)房的機(jī)器可以對(duì)外提供服務(wù)

(2)容量冗余

對(duì)于類似QQ登陸這種入口型的系統(tǒng),必須保持兩倍以上的冗余;如此,可以保證當(dāng)有一個(gè)機(jī)房故障時(shí),所有請(qǐng)求遷移到其他機(jī)房不會(huì)引發(fā)系統(tǒng)過(guò)載。

3、對(duì)電力的不信任

雖然我們?cè)絹?lái)越離不開(kāi)電力,但電力卻不能保證一直在為我們提供服務(wù)。斷電時(shí),其影響和機(jī)器故障、機(jī)房故障類似,機(jī)器會(huì)關(guān)機(jī),數(shù)據(jù)會(huì)丟失,所以,需要對(duì)數(shù)據(jù)進(jìn)行備份。

(1)磁盤備份

來(lái)電后,機(jī)器重啟,可以從磁盤中恢復(fù)數(shù)據(jù),但可能會(huì)有部分?jǐn)?shù)據(jù)丟失。

(2)遠(yuǎn)程備份

機(jī)器磁盤壞了,磁盤的數(shù)據(jù)會(huì)丟失,使用對(duì)于重要系統(tǒng),相關(guān)數(shù)據(jù)應(yīng)當(dāng)考慮采用遠(yuǎn)程備份。

4、對(duì)網(wǎng)絡(luò)的不信任

(1)不同地方,網(wǎng)絡(luò)時(shí)延不一樣

一般來(lái)說(shuō),本地就近的機(jī)器,時(shí)延要好于異地的機(jī)器, 所以,比較簡(jiǎn)單的做法就是近尋址,如CMLB。

也有部分情況,是異地服務(wù)的時(shí)延要好于本地服務(wù)的時(shí)延,所以,如果要做到較好的最優(yōu)路徑尋址,就需要先做網(wǎng)絡(luò)探測(cè),如Q調(diào)

(2)常有網(wǎng)絡(luò)有波動(dòng)或不可用情況

和機(jī)器故障一樣處理,應(yīng)當(dāng)做到自動(dòng)禁用;但網(wǎng)絡(luò)故障和機(jī)器故障又不一樣,經(jīng)常存在某臺(tái)機(jī)器不可用,但別的機(jī)器可以訪問(wèn)的情況,這時(shí)就不能在服務(wù)端禁用機(jī)器了,而應(yīng)當(dāng)采用本地回包統(tǒng)計(jì)策略,自動(dòng)禁用服務(wù)差機(jī)器;同時(shí)需配合定時(shí)探測(cè)禁用機(jī)器策略,自動(dòng)恢復(fù)可正常提供服務(wù)機(jī)器。

5、對(duì)人的不信任

人的因素在運(yùn)營(yíng)的世界里其實(shí)是不穩(wěn)定的因素(大牛除外),所以,不能對(duì)人的操作有過(guò)多的信任。

(1)操作備份

每一步操作都有記錄,便于發(fā)生問(wèn)題時(shí)的回溯,重要的操作需要review,避免個(gè)人考慮不周導(dǎo)致事故。

(2)效果確認(rèn)

實(shí)際環(huán)境往往和測(cè)試環(huán)境是存在一些差異,所有在正式環(huán)境做變更后,應(yīng)通過(guò)視圖review和驗(yàn)證來(lái)確認(rèn)是否符合預(yù)期。

(3)變更可回滾

操作前需對(duì)舊程序、舊配置等做好備份,以便發(fā)生故障時(shí),及時(shí)恢復(fù)服務(wù)。

(4)自動(dòng)化部署

機(jī)器的部署,可能有一堆復(fù)雜的流程,如各種權(quán)限申請(qǐng),各種客戶端安裝等,僅靠文檔流程操作加上測(cè)試驗(yàn)證時(shí)不夠的,可能某次部署漏了某個(gè)步驟而測(cè)試又沒(méi)測(cè)到,上線后就可能發(fā)生事故若能所有流程實(shí)現(xiàn)自動(dòng)化,則可有效避免這類問(wèn)題。

(5)一致性檢查

現(xiàn)網(wǎng)的發(fā)布可能因某個(gè)節(jié)點(diǎn)沒(méi)同步導(dǎo)致漏發(fā),也就是不同的機(jī)器服務(wù)不一樣;對(duì)此,有版本號(hào)的,可通過(guò)版本號(hào)監(jiān)控發(fā)現(xiàn);沒(méi)版本號(hào)的,則需借助進(jìn)程、配置等的一致性檢查來(lái)發(fā)現(xiàn)問(wèn)題。

備注:以上提到的不信任策略,有的不能簡(jiǎn)單的單條使用,需要結(jié)合其他的措施一起使用的。

四、小結(jié)

好了,先寫這么多。最重要的還是那句話,程序的世界里,應(yīng)該堅(jiān)持不信任原則,處處設(shè)防。

責(zé)任編輯:未麗燕 來(lái)源: 騰訊云技術(shù)社區(qū)
相關(guān)推薦

2011-09-22 14:16:16

Wintel

2010-05-10 10:55:28

職場(chǎng)IT培訓(xùn)

2013-09-17 15:19:51

2022-08-18 23:13:25

零信任安全勒索軟件

2011-03-03 15:51:54

2021-10-21 05:58:59

安全多方計(jì)算密碼信息安全

2024-09-27 17:08:45

2017-10-16 09:56:16

2012-07-27 13:51:39

2020-11-23 10:47:46

人工智能開(kāi)發(fā)技術(shù)

2019-05-07 08:33:32

物聯(lián)網(wǎng)設(shè)備物聯(lián)網(wǎng)安全IOT

2018-06-19 11:00:27

服務(wù)器性能數(shù)據(jù)

2014-02-25 15:40:25

2021-05-26 13:19:31

惡意軟件微軟文件

2018-01-29 21:50:20

自動(dòng)駕駛人工智能無(wú)人車

2022-10-09 10:38:58

零信任網(wǎng)絡(luò)安全

2017-11-20 10:37:03

2019-07-25 13:00:23

區(qū)塊鏈節(jié)點(diǎn)客戶端

2021-08-06 17:15:50

零信任物聯(lián)網(wǎng)

2011-08-10 10:14:37

云計(jì)算
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)