欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2018年10月21日 08:39:06   作者:lucywang  
安全是不容忽視的,每個(gè)開(kāi)發(fā)者都知道它非常重要,真正嚴(yán)肅對(duì)待它的卻沒(méi)有幾人。下面這篇文章主要給大家介紹了關(guān)于Node.js中不安全跳轉(zhuǎn)如何防御的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì)。需要的朋友可以參考下

導(dǎo)語(yǔ):

早年在瀏覽器大戰(zhàn)期間,有遠(yuǎn)見(jiàn)的Chrome認(rèn)為要運(yùn)行現(xiàn)代Web應(yīng)用,瀏覽器必須有一個(gè)性能非常強(qiáng)勁的Java引擎,于是Google自己開(kāi)發(fā)了一個(gè)高性能的開(kāi)源的Java引擎,名字叫V8。在2009年,Ryan正式推出了基于Java語(yǔ)言和V8引擎的開(kāi)源Web服務(wù)器項(xiàng)目,命名為Node.js。

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

什么是不安全的重定向?

對(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ò)程中使用,因此可以在登錄之前將用戶重定向到他們所在的頁(yè)面。但根據(jù)業(yè)務(wù)需求或應(yīng)用程序類型而有所不同,也存在其他重定向情況。

為什么要避免重定向?

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

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

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

從表面上看,這些URL看起來(lái)合法且對(duì)用戶來(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ù),則用戶可能最終會(huì)訪問(wèn)黑客所提前設(shè)置的網(wǎng)站(examp1e.com),滿足攻擊的需求!以上只是攻擊者如何利用不安全重定向邏輯的一個(gè)例子。

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

var express = require('express');
var port = process.env.PORT || 3000;
var app = express();

app.get('/login', function (req, res, next) {

 if(req.session.isAuthenticated()) {

 res.redirect(req.query.url);
 }
});

app.get('/account', function (req, res, next) {
 res.send('Account page');
});

app.get('/profile', function (req, res, next) {
 res.send('Profile page');
});

app.listen(port, function() {
 console.log('Server listening on port ' + port);
});

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

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

1.baseHostname會(huì)確保任何重定向都將用戶保留在研究人員的主機(jī)上;

2.redirectMapping是一個(gè)對(duì)象,它將預(yù)定義的輸入(例如,傳遞給url paramer的內(nèi)容)映射到服務(wù)器上的特定路徑;

3.validateRedirect()方法會(huì)判斷預(yù)定義的輸入是否存在,如果它們存在,則返回要重定向的適當(dāng)路徑;

4.研究人員修改了/login邏輯,然后將baseHostname+redirectPath變量連接在一起,這就避免了任何用戶提供的輸入內(nèi)容直接傳遞到Express res.redirect()方法中;

5.最后,研究人員使用encodeURI()方法作為額外的安全保證,確保連接字符串的URI部分被正確編碼,以允許干凈的重定向。

//Configure your whitelist
var baseHostname = "https://example.com";
var redirectMapping = {
 'account': '/account',
 'profile': '/profile'
}

//Create a function to validate whitelist
function validateRedirect(key) {
 if(key in redirectMapping) {

  return redirectMapping[key];
 }else{

  return false;
 }
}

app.get('/login', function (req, res, next) {
 if(req.session.isAuthenticated()) {
 redirectPath = validateRedirect(req.query.url);

 if(redirectPath) {
 res.redirect(encodeURI(baseHostname + redirectPath));
 }else{
 res.send('Not a valid redirect!');
 }
 }
});

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

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

例如,安全平臺(tái)可能希望在用戶登錄后將其重定向回電子商務(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變量。

//Configure your whitelist
var baseHostname = "https://example.com";

app.get('/login', function (req, res, next) {
 productId = (req.query.productId || '');
 whitelistRegEx = /^[a-zA-Z0-9]{16}$/;

 if(productId) {
  
  //Validate the productId is alphanumeric and exactly 16 characters
  if(whitelistRegEx.test(productId)) {

   res.redirect(encodeURI(baseHostname + '/item/' + productId));
  }else{

   //The productId did not meet the RegEx whitelist, so return an error
   res.send('Invalid product ID');
  }
 }else{
 
  //No productId was provided, so redirect to home page
  res.redirect('/');
 }
});

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


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

本文翻譯自:https://blog.hailstone.io/how-to-prevent-unsafe-redirects-in-node-js

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • 如何通過(guò)node.js來(lái)寫(xiě)接口詳解

    如何通過(guò)node.js來(lái)寫(xiě)接口詳解

    最近研究了一下nodejs寫(xiě)接口,發(fā)現(xiàn)接口并不難寫(xiě),這篇文章主要給大家介紹了關(guān)于如何通過(guò)node.js來(lái)寫(xiě)接口的相關(guān)資料,文中通過(guò)實(shí)例代碼和圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2022-09-09
  • node.js中的fs.ftruncate方法使用說(shuō)明

    node.js中的fs.ftruncate方法使用說(shuō)明

    這篇文章主要介紹了node.js中的fs.ftruncate方法使用說(shuō)明,本文介紹了fs.ftruncate的方法說(shuō)明、語(yǔ)法、接收參數(shù)、使用實(shí)例和實(shí)現(xiàn)源碼,需要的朋友可以參考下
    2014-12-12
  • node.js中的querystring.unescape方法使用說(shuō)明

    node.js中的querystring.unescape方法使用說(shuō)明

    這篇文章主要介紹了node.js中的querystring.unescape方法使用說(shuō)明,本文介紹了querystring.unescape的方法說(shuō)明、語(yǔ)法、接收參數(shù)、使用實(shí)例和實(shí)現(xiàn)源碼,需要的朋友可以參考下
    2014-12-12
  • node.js中的fs.createReadStream方法使用說(shuō)明

    node.js中的fs.createReadStream方法使用說(shuō)明

    這篇文章主要介紹了node.js中的fs.createReadStream方法使用說(shuō)明,本文介紹了fs.createReadStream方法說(shuō)明、語(yǔ)法、接收參數(shù)、使用實(shí)例和實(shí)現(xiàn)源碼,需要的朋友可以參考下
    2014-12-12
  • 關(guān)于express與koa的使用對(duì)比詳解

    關(guān)于express與koa的使用對(duì)比詳解

    很多人都在問(wèn)到底該用Koa還是express,所以下面這篇文章就來(lái)給大家再次的對(duì)比了關(guān)于express與koa的相關(guān)資料,通過(guò)對(duì)比大家可以更好的進(jìn)行選擇,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-01-01
  • node.js操作mysql(增刪改查)

    node.js操作mysql(增刪改查)

    本文給大家分享的是使用node.js實(shí)現(xiàn)對(duì)mysql數(shù)據(jù)庫(kù)的增刪改查操作,有需要的小伙伴可以參考下,希望對(duì)大家學(xué)習(xí)node有所幫助。
    2015-07-07
  • node.js中格式化數(shù)字增加千位符的幾種方法

    node.js中格式化數(shù)字增加千位符的幾種方法

    這篇文章主要介紹了node.js中格式化數(shù)字增加千位符的幾種方法,本文給出3種實(shí)現(xiàn)方法,并分別給出實(shí)例代碼,需要的朋友可以參考下
    2015-07-07
  • 詳解npm 配置項(xiàng)registry修改為淘寶鏡像

    詳解npm 配置項(xiàng)registry修改為淘寶鏡像

    這篇文章主要介紹了詳解npm 配置項(xiàng)registry修改為淘寶鏡像,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-09-09
  • NodeJS中配置請(qǐng)求代理服務(wù)器方式

    NodeJS中配置請(qǐng)求代理服務(wù)器方式

    這篇文章主要介紹了NodeJS中配置請(qǐng)求代理服務(wù)器方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-10-10
  • Node.js實(shí)現(xiàn)注冊(cè)郵箱激活功能的方法示例

    Node.js實(shí)現(xiàn)注冊(cè)郵箱激活功能的方法示例

    現(xiàn)在很多網(wǎng)站都需要有注冊(cè)郵箱激活的功能,本篇文章主要介紹了Node.js實(shí)現(xiàn)注冊(cè)郵箱激活功能的方法示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-03-03

最新評(píng)論