2016-11-29 6 views
2

私はnode.js(expressjs)に小さな画像プロキシを開発しました。このプロキシは、私のウェブサイト「www.myUrl.com」から来るすべてのイメージを減らす必要があります。これはこれまでもうまくいきます。しかし、私は不正なアクセスからプロキシを保護したいと思います。 つまり、別のURLからプロキシ経由でイメージがロードされると、エラーメッセージ "unauthorized"またはnull ...が返されます。 Iはすでにreq.headers.origin介してヘッダを読み取るために、「原点」を試みたが、これは空であった:Nodejs express.js(プロキシ)サーバーを特定のドメインに対してのみ使用できるようにするにはどうすればよいですか?

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" 
} 

プロキシがmodulus.ioでホストされています。 "www.myUrl.com"はMeteor.jsアプリです。

ドメイン "www.myUrl.com"に対してのみプロキシを使用できるようにするにはどうすればよいですか?

ありがとうございました。

更新:

画像は、単にクライアントで画像タグの上にロードされます :あなたは熱い禁止したい

私が正しくあなたの質問を理解していれば
<img src='http://myImageProxyUrl.com/imageXY.png' /> 
+0

プロキシにアクセスするための認証方法を提供しています。どのようなURLを呼び出しても、そのトークンを持っていなければなりません。 – AJS

+0

このトークンはクライアントに表示され、コピーできますか? – laren0815

+0

暗号化トークンを渡すことができるようにいくつかの暗号化技術を使用します。または、あなたのサーバー上のリクエストヘッダーを確認することができますif(request.headers.host == 'www.myUrl.com'){proceed} else {unauthorized message} – AJS

答えて

1

(それは非常に明確ではありません)プロキシによって配信された画像を自分以外のウェブサイトにリンクする。そうであれば、Refererヘッダーを確認する必要があります。あなたはエクスプレスアプリでこのようなルートを持っている場合は、次の場合は、

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

または:

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

は何かなどをすることができcheckRefererの実装:

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

その後、あなたはそれを変更することができますあなたはRefererヘッダなしの使用を許可したいと考えています:

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

Refererヘッダーがまったくなくても、適切なURLで始まる必要がある場合は、上記は機能します。この関数は、ドメインを追加したい場合や、example.comとwww.example.comなどの両方を許可したい場合は、さらに複雑になる必要があります。RefererがあなたのためにOKなら、この関数はtrueを返す必要がありますそれがなければfalseとなります。

xShiraseがコメントの中で指摘してくれたことにより、ルートハンドラを変更する代わりにミドルウェアを追加する方が良いでしょう。そうすれば、多くの場所でそのロジックを複製する必要はありません。たとえば:

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

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

これは私の欲しいものです。 「Referer」ヘッダーがブラウザから送信されていること、またはIEを使用しているときなど、一部のユーザーが自分のWebサイトに画像を表示しない可能性がありますか? – laren0815

+0

@rspの場合、Expressで実行するとOPが選択する方法がミドルウェアの方が効率的です。これをあなたの答えに加えることができますか?あなたの雷を盗んではいけない;) – xShirase

+0

@xShiraseそれを指摘してくれてありがとう。私は答えに加えました。 – rsp

2

あなたがリバースプロキシとしてnginxのを使用したほうが良いだろうように思える:

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

は何も変更せずにルートハンドラ、その後(checkRefererは上記と同じです)そのような仕事のために。

アプリレベルでアクセスをブロックすることで、正当なリクエストで使用できるリソースが無駄になってしまいます。プロダクションソリューションを探している場合は、アプリに到達した後にリクエストをブロックしないでください。

単純な例は、あなたのサイトをDoSする試みです。攻撃者はすべて、あなたのアプリケーションをクロールまで遅らせるための迷惑メールリクエストです。 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のを使用する方法の多くのリソースがありますが、それは本当に簡単です。がんばろう!

関連する問題