av激情亚洲男人的天堂国语,日韩欧美精品一中文字幕,无码av一区二区三区无码,国产又色又爽又刺激的a片,国产又色又爽又刺激的a片

如何防御Node.js中的不安全跳轉(zhuǎn)

什么是不安全的重定向?

成都創(chuàng)新互聯(lián)是一家專(zhuān)業(yè)提供金水企業(yè)網(wǎng)站建設(shè),專(zhuān)注與網(wǎng)站設(shè)計(jì)、做網(wǎng)站、成都h5網(wǎng)站建設(shè)、小程序制作等業(yè)務(wù)。10年已為金水眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專(zhuān)業(yè)網(wǎng)絡(luò)公司優(yōu)惠進(jìn)行中。

對(duì)于任何web開(kāi)發(fā)人員來(lái)說(shuō),不安全或未經(jīng)驗(yàn)證的重定向都是重要的安全考慮因素。Express為重定向提供了本地支持,使它們易于實(shí)現(xiàn)和使用。然而,Express將執(zhí)行輸入驗(yàn)證的工作留給了開(kāi)發(fā)人員。Express是一種保持最低程度規(guī)模的靈活Node.js Web應(yīng)用程序框架,為Web和移動(dòng)應(yīng)用程序提供一組強(qiáng)大的功能。

下面是OWASP.org網(wǎng)站給出的“未經(jīng)驗(yàn)證的重定向和轉(zhuǎn)發(fā)”的定義:

如果web應(yīng)用程序接受不可信的輸入,可能導(dǎo)致web應(yīng)用程序?qū)⒄?qǐng)求重定向到不可信輸入中包含的URL,則可以進(jìn)行未經(jīng)驗(yàn)證的重定向和轉(zhuǎn)發(fā)。

重定向通常在登錄和身份驗(yàn)證過(guò)程中使用,因此可以在登錄之前將用戶(hù)重定向到他們所在的頁(yè)面。但根據(jù)業(yè)務(wù)需求或應(yīng)用程序類(lèi)型而有所不同,也存在其他重定向情況。

[[246704]]

為什么要避免重定向?

不驗(yàn)證用戶(hù)輸入的重定向,可以使攻擊者具備發(fā)起網(wǎng)絡(luò)釣魚(yú)詐騙的條件,從而竊取用戶(hù)憑據(jù)并執(zhí)行其他惡意操作。

注意:當(dāng)在Node.js或Express中實(shí)現(xiàn)重定向時(shí),在服務(wù)器端執(zhí)行輸入驗(yàn)證很重要。

如果攻擊者發(fā)現(xiàn)用戶(hù)沒(méi)有驗(yàn)證外部用戶(hù)提供的輸入,他們可能會(huì)利用這個(gè)漏洞在論壇、社交媒體和其他公共場(chǎng)所發(fā)布專(zhuān)門(mén)設(shè)計(jì)的鏈接,讓用戶(hù)點(diǎn)擊它。

從表面上看,這些URL看起來(lái)合法且對(duì)用戶(hù)來(lái)說(shuō)并無(wú)威脅,這是因?yàn)樗羞@些要重定向的URL都包含目標(biāo)的主機(jī)名:

https://example.com/login?url=http://examp1e.com/bad/things

但是,如果服務(wù)器端重定向邏輯未驗(yàn)證輸入url參數(shù)的數(shù)據(jù),則用戶(hù)可能最終會(huì)訪(fǎng)問(wèn)黑客所提前設(shè)置的網(wǎng)站(examp1e.com),滿(mǎn)足攻擊的需求!以上只是攻擊者如何利用不安全重定向邏輯的一個(gè)例子。

不安全重定向例子并將其直接傳遞到Express res.redirect()方法中。因此,只要用戶(hù)通過(guò)身份驗(yàn)證,Express就會(huì)將用戶(hù)重定向到輸入或提供的URL。

 
 
 
 
  1. var express = require('express'); 
  2. var port = process.env.PORT || 3000; 
  3. var app = express(); 
  4.  
  5. app.get('/login', function (req, res, next) { 
  6.  
  7.     if(req.session.isAuthenticated()) { 
  8.  
  9.         res.redirect(req.query.url); 
  10.     } 
  11. });  
  12.  
  13. app.get('/account', function (req, res, next) { 
  14.     res.send('Account page'); 
  15. }); 
  16.  
  17. app.get('/profile', function (req, res, next) { 
  18.     res.send('Profile page'); 
  19. }); 
  20.  
  21. app.listen(port, function() { 
  22.     console.log('Server listening on port ' + port); 
  23. }); 

輸入驗(yàn)證有助于防止不安全的重定向

通常,最好避免在代碼中使用重定向和轉(zhuǎn)發(fā)。如果你一定需要在代碼中使用重定向,則首選的方法是使用映射到特定目標(biāo)的預(yù)定義輸入,這被稱(chēng)為白名單方法。以下就是實(shí)現(xiàn)這種方法的一個(gè)具體樣本步驟:

  • baseHostname會(huì)確保任何重定向都將用戶(hù)保留在研究人員的主機(jī)上;
  • redirectMapping是一個(gè)對(duì)象,它將預(yù)定義的輸入(例如,傳遞給url paramer的內(nèi)容)映射到服務(wù)器上的特定路徑;
  • validateRedirect()方法會(huì)判斷預(yù)定義的輸入是否存在,如果它們存在,則返回要重定向的適當(dāng)路徑;
  • 研究人員修改了/login邏輯,然后將baseHostname+redirectPath變量連接在一起,這就避免了任何用戶(hù)提供的輸入內(nèi)容直接傳遞到Express res.redirect()方法中;
  • 最后,研究人員使用encodeURI()方法作為額外的安全保證,確保連接字符串的URI部分被正確編碼,以允許干凈的重定向。
 
 
 
 
  1. //Configure your whitelist 
  2. var baseHostname = "https://example.com"; 
  3. var redirectMapping = { 
  4.     'account': '/account', 
  5.     'profile': '/profile' 
  6.  
  7. //Create a function to validate whitelist 
  8. function validateRedirect(key) { 
  9.     if(key in redirectMapping) { 
  10.  
  11.         return redirectMapping[key]; 
  12.     }else{ 
  13.  
  14.         return false; 
  15.     } 
  16.  
  17. app.get('/login', function (req, res, next) { 
  18.     if(req.session.isAuthenticated()) { 
  19.         redirectPath = validateRedirect(req.query.url); 
  20.  
  21.         if(redirectPath) { 
  22.             res.redirect(encodeURI(baseHostname + redirectPath)); 
  23.         }else{ 
  24.             res.send('Not a valid redirect!'); 
  25.         } 
  26.     } 
  27. }); 

其他重定向場(chǎng)景

在某些情況下,將每個(gè)組合列入白名單是不切實(shí)際的,不過(guò)有些安全平臺(tái)仍然希望重定向用戶(hù)并將其保留在域內(nèi)某些邊界內(nèi)。當(dāng)外部提供的值遵循特定模式(例如16個(gè)字符的字母數(shù)字字符串)時(shí),最好這樣做。字母數(shù)字字符串是理想的,因?yàn)樗鼈儾话魏慰赡芤肫渌舻奶厥庾址缒夸?路徑遍歷(依賴(lài)于諸如...和向后/向前斜杠之類(lèi)的字符)。

例如,安全平臺(tái)可能希望在用戶(hù)登錄后將其重定向回電子商務(wù)網(wǎng)站上的特定產(chǎn)品。由于電子商務(wù)網(wǎng)站對(duì)每種產(chǎn)品都有唯一的字母數(shù)字值,因此安全平臺(tái)可以通過(guò)始終根據(jù)RegEx白名單驗(yàn)證外部輸入來(lái)實(shí)現(xiàn)安全重定向。在本文所講的樣本在,研究者用的是productId變量。

 
 
 
 
  1. //Configure your whitelist 
  2. var baseHostname = "https://example.com"; 
  3.  
  4. app.get('/login', function (req, res, next) { 
  5.     productId = (req.query.productId || ''); 
  6.     whitelistRegEx = /^[a-zA-Z0-9]{16}$/; 
  7.  
  8.     if(productId) { 
  9.          
  10.         //Validate the productId is alphanumeric and exactly 16 characters 
  11.         if(whitelistRegEx.test(productId)) { 
  12.  
  13.             res.redirect(encodeURI(baseHostname + '/item/' + productId)); 
  14.         }else{ 
  15.  
  16.             //The productId did not meet the RegEx whitelist, so return an error 
  17.             res.send('Invalid product ID'); 
  18.         } 
  19.     }else{ 
  20.      
  21.         //No productId was provided, so redirect to home page 
  22.         res.redirect('/'); 
  23.     } 
  24. }); 

最后,安全平臺(tái)發(fā)出警告,警告用戶(hù)他們正在被自動(dòng)重定向是值得重視的。如果安全平臺(tái)有意將用戶(hù)重定向到域外,則可能需要在流程中創(chuàng)建一個(gè)中間頁(yè)面,該頁(yè)面會(huì)發(fā)出如下警告,并包含用戶(hù)要重定向到的URL。

注:本文是以Hailstone為例進(jìn)行講解的,Hailstone是一個(gè)應(yīng)用程序安全平臺(tái),它有查找代碼中的漏洞功能。


分享標(biāo)題:如何防御Node.js中的不安全跳轉(zhuǎn)
URL鏈接:http://uogjgqi.cn/article/coipcie.html
掃二維碼與項(xiàng)目經(jīng)理溝通

我們?cè)谖⑿派?4小時(shí)期待你的聲音

解答本文疑問(wèn)/技術(shù)咨詢(xún)/運(yùn)營(yíng)咨詢(xún)/技術(shù)建議/互聯(lián)網(wǎng)交流