簡體   English   中英

如何使Node.js express.js(代理)服務器僅可用於特定域?

[英]How can I make a Nodejs express.js (proxy) server available only for a specific domain?

我在node.js(expressjs)中開發了一個小型圖片代理。 該代理應減少來自我的網站“ www.myUrl.com”的所有圖像。 到目前為止,這也很好。 但是我想保護代理免受未經授權的訪問。 即,一旦通過代理從另一個URL加載了圖像,將返回錯誤消息“未經授權”或null...。 我已經嘗試通過req.headers.origin讀取標頭“ origin”,但這是空的:

console.log(JSON.stringify(req.headers))顯示如下:

{
"host":"myImageProxyUrl.com",
"user-agent":"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko)Chrome/54.0.2840.100Safari/537.36","accept":"image/webp,image/*, */*; q=0.8",
"accept-encoding":"gzip, deflate, sdch, br",
"accept-language":"de-DE,de;q=0.8,en-US;q=0.6,en;q=0.4",
"connection":"keep-alive",
"referer":"https://myUrl.de/myPage",
"x-forwarded-for":"ip1,ip2",
"x-forwarded-proto":"https, https",
"x-mod-original-region":"joyent-eu-ams-1.onmodulus.net",
"x-mod-region":"aws-us-east-1a.onmodulus.net"
}

該代理托管在模數.io。 “ www.myUrl.com”是一個Meteor.js應用程序。

如何使代理僅可用於域“ www.myUrl.com”?

謝謝。

更新:

圖像只是通過客戶端中的圖像標簽加載:

<img src='http://myImageProxyUrl.com/imageXY.png' />

似乎最好將nginx用作此類工作的反向代理。

通過在應用程序級別阻止訪問,您正在浪費合法請求可能使用的資源。 如果您正在尋找生產解決方案,請避免在請求到達您的應用后阻止請求。

一個簡單的例子就是嘗試對您的站點進行DoSing,攻擊者所要做的就是發送垃圾郵件請求,以使您的應用程序慢下來進行爬網。 Nginx允許您使用速率限制並減少發生這種情況的機會。

該技術與nginx相同,請檢查標頭並屏蔽除具有正確引薦來源網址之外的所有內容。

引薦來源網址過濾的配置如下所示:

location / {
    if ($http_referer !~ "myurl.com"){
          return 403
    }

    proxy_pass http://127.0.0.1:3000;  #replace 3000 by the port your app runs on
    proxy_http_version 1.1;
    proxy_set_header X-NginX-Proxy true;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection 'upgrade';
    proxy_set_header Host $host;
    proxy_cache_bypass $http_upgrade;       
}

關於如何將Nginx用作Express應用程序的反向代理,有很多資源,這很簡單。 祝好運!

如果我正確理解了您的問題(不是很清楚),那么您想禁止將代理服務器提供的圖像熱鏈接到您自己網站以外的其他網站。 如果是這樣,那么您需要檢查Referer標頭。 如果您的Express應用中有這樣的路線:

app.get('/something', function (req, res, next) {
    // some response
});

然后您可以將其更改為:

app.get('/something', function (req, res, next) {
  if ( checkReferer(req) ) {
    // respond normally
  } else {
    // respond with error
  }
});

實現checkReferer可以像這樣:

function checkReferer(req) {
  var url = 'http://good.url.com/';
  return req.get('Referer').indexOf(url) === 0;
}

或者,如果您想允許不使用Referer標頭使用:

function checkReferer(req) {
  var url = 'http://good.url.com/';
  return !req.get('Referer') || req.get('Referer').indexOf(url) === 0;
}

如果根本沒有Referer標頭,則以上內容將起作用,但是如果存在Referer標頭,則必須以正確的URL開頭。 如果要添加更多域,或者要同時允許example.com和www.example.com等,此功能可能會變得更加復雜。重要的是,如果Referer適合您,則此函數應返回true 。要求,如果不是,則為false

更好的方法(感謝xShirase在注釋中指出)是添加中間件而不是修改路由處理程序。 這樣,您不必在許多地方重復該邏輯。 例如:

app.use(function (req, res, next) {
  if ( checkReferer(req) )
    return next();
  res.status(403).send('Forbidden');
});

checkReferer與上面的相同),然后路由處理程序保持不變:

app.get('/something', function (req, res, next) {
    // some response
});

app.get('/something/else', function (req, res, next) {
    // another response
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM