從零搭建Node講義_第1頁(yè)
從零搭建Node講義_第2頁(yè)
從零搭建Node講義_第3頁(yè)
從零搭建Node講義_第4頁(yè)
從零搭建Node講義_第5頁(yè)
已閱讀5頁(yè),還剩13頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

關(guān)于網(wǎng)絡(luò)安全計(jì)算機(jī)網(wǎng)絡(luò)依據(jù)TCP/IP協(xié)議棧分為了物理層、網(wǎng)絡(luò)層、傳輸層、應(yīng)用層,通?;A(chǔ)設(shè)施供應(yīng)商會(huì)解決好前三層的網(wǎng)絡(luò)安全問題,需要開發(fā)者自行解決應(yīng)用層的網(wǎng)絡(luò)安全問題,本章將著重表述應(yīng)用層常見的網(wǎng)絡(luò)安全問題及處理方法。網(wǎng)絡(luò)層物理層常見的應(yīng)用層攻擊手段XSSXSS(cross-sitescripting),跨站腳本攻擊,通過在頁(yè)面中注入腳本發(fā)起攻擊。舉個(gè)例子:我在一個(gè)有XSS缺陷的在線商城開了一家店鋪,編輯商品詳情頁(yè)時(shí)提交了這樣的描述:特制辣者(scriptsrc="kttps://cross-sitescripting/attack.js"x/scnpt'>?當(dāng)用戶訪問該商品的詳情時(shí)attack.^就被執(zhí)行了,我通過該腳本可以在用戶不知情的情況下竊取數(shù)據(jù)或者發(fā)起操作,比如:把用戶正在瀏覽的商品加入到購(gòu)物車。CSRFCSRF(cross-siterequestforgery),跨站請(qǐng)求偽造,通過偽造用戶數(shù)據(jù)請(qǐng)求發(fā)起攻擊。舉個(gè)例子:我在一個(gè)有CSRF缺陷的論壇回復(fù)了一則熱門帖:贊!src="/api/cross-site.?r&quest=forge.ry"/>,當(dāng)用戶訪問到這條回復(fù)時(shí)沁g標(biāo)簽就會(huì)在用戶不知情的情況下以該用戶的身份發(fā)起提前設(shè)置的請(qǐng)求,比如:轉(zhuǎn)1積分到我自己的帳號(hào)上。SQLiSQLi(SQLinjection),SQL注入,通過在數(shù)據(jù)庫(kù)操作注入SQL片段發(fā)起攻擊。SQLi是非常危險(xiǎn)的攻擊,可以繞過系統(tǒng)中的各種限制直接對(duì)數(shù)據(jù)進(jìn)行竊取和篡改。但同時(shí),SQLi又是比較容易防范的,只要對(duì)入?yún)⒆址龊棉D(zhuǎn)義處理就可以規(guī)避,常見的ORM模塊都做好了此類處理。DoSDoS(denial-of-service),拒絕服務(wù)攻擊,通過大量的無(wú)效訪問讓應(yīng)用陷入癱瘓。在DoS基礎(chǔ)上又有DDoS(distributeddenial-of-service),分布式拒絕服務(wù)攻擊,是加強(qiáng)版的DoSo通常此類攻擊在傳輸層就已經(jīng)做好了過濾,應(yīng)用層一般在集群入口也做了過濾,應(yīng)用節(jié)點(diǎn)不需要再關(guān)心。攻擊測(cè)試再回到上一章己完成的工程hostl-tech/nodejs-server-examples-07-authentication,當(dāng)前的店鋪管理功恰好因?yàn)榈赇伱Q長(zhǎng)度校驗(yàn)限制和沒有基于httpget的變更接口而一定程度上規(guī)避了XSS和CSRF缺陷,另外因?yàn)閿?shù)據(jù)庫(kù)訪問基于ORM實(shí)現(xiàn)也基本規(guī)避了SQLi缺陷?,F(xiàn)在把長(zhǎng)度校驗(yàn)放松以進(jìn)行XSS攻擊測(cè)試://sirc/kv\oulds/ShopForkv\.jsconstYup=requireCyup1);exports.createShopForyv\Sche^v\a=()=>Yup.object({nanae:Yupstnng().Kequired。店鋪名不能為空,).wu認(rèn)(3J店鋪名至少3個(gè)字符,)皿公(工2?!沟赇伱豢沙^XZO字'),!);XSS攻擊1百草味<S"3t>a/e”XSS攻擊1成功:店鋪列表:良品鋪?zhàn)虞斎胄碌牡赇伱Q確認(rèn)修改制除店鋪來(lái)伊份輸入新的店鋪名稱確認(rèn)修改制除店鋪三只松鼠輸入新的店鋪名稱確認(rèn)修改刪1除店鋪美珍香輸入新的店鋪名稱確認(rèn)修改刪除店鋪確認(rèn)新增店鋪新增:確認(rèn)新增新店鋪的名稱:XSS攻擊2廣州酒家<,?oMrror^"alert('XSS攻擊2成功:店鋪列表:■良品鋪?zhàn)虞斎胄碌牡赇伱Q確認(rèn)修改制|除店鋪?來(lái)伊份輸入新的店鋪名稱確認(rèn)修改UH除店鋪?三只松鼠輸入新的店鋪名稱確認(rèn)修改UH除店鋪?美珍香輸入新的店鋪名稱確認(rèn)修改刪除店鋪店鋪新增:新店鋪的名稱:確認(rèn)新增基于innerHTML更新DOM時(shí)script標(biāo)簽不會(huì)執(zhí)行(詳見標(biāo)準(zhǔn)),所以XSS攻擊1無(wú)效。在換了新的寫法后,XSS攻擊2就生效了。強(qiáng)化網(wǎng)絡(luò)安全接下來(lái)通過escape-html、csurf,helmet對(duì)當(dāng)前工程的網(wǎng)絡(luò)安全進(jìn)行強(qiáng)化,在工程根目錄執(zhí)行以下安裝命令:$yanaaddescape-htwlcsurfkeli^et#本地安裝escapecs〃rf、he/kwet#...infoDirectdependencies|—直〃同@工.”.0|—escape*—he/kv\et@3.2:5.3#...對(duì)店鋪信息輸出做轉(zhuǎn)義處理://src/utils/escape-hti^l-in-objectJsconste$capeHtkv\l=requireCe^cape-htkv\f);kvxodu/e.exports=fuMtione$capeHtkv\lli^Object(i^put){//嘗試將ORM對(duì)象轉(zhuǎn)化為普通對(duì)象try(input=ii^put.toJSONO;}catck{}//對(duì)類型為stHng的值轉(zhuǎn)義處理if(Arr^y.isArr^yf/nput)){returninput.kv\ap(e$capeHtkv\[liaObject);}elseif(typeofi^put=='object1){constoutput={};Object.keys(i^put).forEach(k=>{output[k]=e$capeHtkv\llnObject(iiaput[k]');!);returnoutput;}ekeif(typeofinput=='string'){returne$capeHtkv\l(i^put);}else(returnmput;//srr/c。八卅。也rs/skopjsconst{Router]=/eqiai必exp丫ess);constbodyparser=require('body-parsed);constskopService=req"e('../services/shop');const{createSkopFori^Schei^a]=require(,../kv\oulds/ShopForkv\,);constcc-require(,../utils/cc');^co^tescapeHti^llnObject=reqiAire('../uti^/escape-ht^l-iia-object);classShopCoiatroller{shopSer/ice;asyncinit(){thisshopSefvice=awaitshopSewice。;constrouter=Router();router.getC/'jthis.getA");router.getC/ishopld1jtkis.getOM);router.putC/ishopId1jtki^.put);router.delete(,/:shopld,jtWs.de/ete);router.postC/1,bodyParser.urlencoded({extended:false-}),this.post);returnrouter;)getAlI="(asgnc"eq,res)=>{const{pagelndeXjpageSize]=req.querg;constshopUst=a\A/aitthisshopSeirvice.fi^d({page心dex,pageSize});- res.se八d({success:true,data:skopList});+resse^d(escapeHt^ll^Obje.ct({success:true,data:shopList)));1);get。八e=cc(a$ync(req,res)=>{const{shopld)=req.parai^s;constskopList=avjaittkisshopService.fiiad({id:shopId});if(shopList.length){一 res.se八d({success:true,data:skopList[0]});+res.send(escapcHtkv\〃八。句"t({success:true,data:skopList[0]}));}eke(resstatus(4O4)send({success:false,data:八〃"));)!);put=cc(asytac(req,res)=>{const{shopld)=req.params;

const{nakv\e}=re^.^uery;try(a\A/aitcreateShopFori^Sche^.aC).validate({i^a^v\e});}catch(e){res.status(4OO).send({success:false,message:e.message));return;}constshopinfo=awaitthisshopService.i^odify({id:shopld,values:{八〃Me卜1);if(shopMfo){- res.se八或{success:truCjdata:shoplnf。});十res.send(e$capeHti^lliaObject({success:true,data:shopInfo)));}eke{res.st〃t〃s(4O4).send({success:fake,data:八u"));)!);delete=cc(asyM(req,res)=>{

const{shopld)=req.para^;constsuccess=a\A/aitthi^sk\opService.rekv\ove({id:shopld});iff/success){res.st?tus(4C>4);)res.send({success});1);post=cc(a^ync(req,res)=>{const(八〃kne)=req.body;try{awaitcreateShopFori^Sche^a().validate({nai^xe));}catch(e){resstatus(4OO)seiad({success:fake,message:e.knessage});return;}constshopInfo=awaitthisshopService.Cfreate({values:{iaai^e}});- res.se八d({success:true,data:shopInfo});+res.send(escapeHt^lltaObject((success:truejdata:shopInfo}));));}Mod川'.exports=a$ync()=>{constc=newShopCoiatrollerO;returna\A/aitc.iiait();1;再次嘗試XSS攻擊2廣州酒家《加gsrc=HJ,onenror="alert('XSS攻擊2成功:<-->CO①localhost:9000☆。Incognito:店鋪列表:良品鋪?zhàn)覫輸入新的店鋪名稱 I確認(rèn)修改刪除店鋪來(lái)伊份I輸入新的店鋪名稱 I通限修改制除店鋪三只松鼠I輸入新的店鋪名稱 I確認(rèn)修改刪除店鋪美珍香I輸入新的店鋪名稱 I確認(rèn)修改刪除店鋪店鋪新增:新店鋪的名稱:I 確認(rèn)新增這樣就可以抵御XSS攻擊了,現(xiàn)在再預(yù)防一下CSRF攻擊://sfc/MidcUewaires/i八dexjsconst{Router}=reqai憶('expiress);constcookieParser=require^cookie-parse^y^-constbodyparser=require('body-parser1);-i-constcsurf=requireCcsurP);constsessi。八Middleware=夕equi/eC./session);consturliaor^alizeMiddlewaire=reqix/refVurlnoIize1);constlogicMiddlewaFe=irequiire('./logic');constMiddleware=require^./auth');constsecret='842dq18ced,888c65a65Ofqq:5O77c^4:56b8f工[4小;module.exports=asyncfunctioninitMiddle\A/are$(){constrouter=RouterQ;r?!╰er.〃se(u"八。?vvahNeM以dIewe。);routerusefcookreParserfsecret));r0〃ter.use(sessio八Midd/ew〃rc(secre。);router.use(/oginMid山ewe。);r0uter.use(〃uthMid山ew〃re());+routerusefbodyParserurlencoded({extended:false})」csurfQ);returnrouter;);//^rc/controllers/csrf.jsco^st{Router}=Kcq〃iKC('express');classCsrfController{asyncMit(){constrouter=RouterO;route>r.get('/^cnpt1,this.getScript);returnrouter;)getScnpt=(req,res)=>{res.tgpe(JC);res.se八WCwindow.—CSRFJTOKEN-MS&eq.csrfToken()}';、););)module.exports=async()=>{constc=newCsirfCoiatroHerO;returnawaitc.Mit。);co八st{parse]=module.exports=function(oginMiddJewa/伙ho^v\epagePatk=*/Slogii^Patk=/ogicktMp,whiteList={7500.^1^:['get],

7api/csrf/script1:「getj.'/api/logic':[post]'/api/(ogi八/github':[get],'/api/logi^/github/callback1:['get'Jj])(//...);</--public/logi八.html-><htw/><kead><kv\etach^rset=,,utf-8n/>+ 〈scriptsrc-17api/csrf/script,,x/scnpt></head><body><fornAi^ethod-,lpost11action="/api/logW〉+ <scnpt>+docukv\ent.wnte('〈inputtype="hiddeia"八〃Me="_csrP,uHue="$JCSRF_TOKENJ"/>、+ );+</script>^buttontgpe="submit"〉一鍵登錄八〉</forw><ahref^,7api/logi^github,lxbutto^>Ciitkub登錄八x/a></body></htkv\l>

</--public/—><k\ead><i^etacharset="utf-8"/>VMkref=,,styfesheet/,kreF=".//'八dex.css”/>+ Scriptsrc="/api/csrf/scHpt"x/swipt〉</head></--...-->//public/i八dexjs//...exportasyncfunctionkiaodifySkoptnfo(e){constshopld=e.target.pare^tEle^e^t.datasetshopld;const八〃kwe=c.target.pare^tElei^eia.t.querySelectoirCi^put^.value)try(a\A/aitcreateShopFori^Sche^a().validate({八〃xe});}catch({message}){e.target.parentElei^ent.q(AerySelector(,.error1).inMrHTML=Message;return;)awaitfetck(Vapi/skop/^{shopld]?k\ai^e=^{encodeUR.ICokv\poMiat(nakv\e)yj{

method:method:'PUTj-i-headers:{+Csrf-Token,:_CSRFJTOKEN一+1);a\A/aitrefreskShopListO;}exportasyncfunctionrewxoveShop伍Fo(e){constshopld=e.target.pare^tEleyv\eiat.datasetskopld;-constres=awaitfetck(、/api/shop/${shopld}、,{method:'DELETE'});+constres=a\A/aitfetch(Vapi/skop/${shopE}、,{+method:'DELETE'^headers:{+'Csrf-Tokeia1:_CSRF_TOKEN一+ 上!);avjait/efireshShopList。;}exportasyncfunctionweateShopI八fo(e){e.preveiatDefaultO;const八〃kv\e=e.target.parentElement.querySelecto^inputliaai^^iaai^eJ^.^alue;try(a\A/aitcreateSkopFormSche^a().validate({八〃kwe});}catch({message}){e.target.pairentEle^eiat.querySelectorC.enro^.inMrHTML=Message;return;)avjaitfetckC/api/skop1,{method:,POSTJheader:{^onte^t-Type1:1applicationx-v^yA/^-for^-urle^coded1^ 'C^rf-Token1:_CSRF_TOKEN一bbody:^na^v\e=i{eModeURlCo^A.poMnt(MKv\e)]''J!);a\^/aitrefreshShopUstO;]最后,使用helmet模塊通過http頭控

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論