ページ

2012-12-09

node + expressでホスト名を見てアクセス制限した話


node + expressでホスト名を見てアクセス制限をする方法


どゆこと?

例えばlocalhostというアドレスでアクセスされた場合にはアクセスを受け付けるけど、127.0.0.1という感じでIPアドレス直打ちでアクセスされた場合にはリクエストを受け付けない(ファイヤーウォールの用にアクセスそのものを受け付けないのではなく400 Bad Requestのレスポンスを返す)ようにする方法です。

ローカルにnodeで鯖立ててるけど、別のマシンからアクセスされたくない時等など色々な場面で使えると思います。


なんでアクセスされたアドレスが分かるの?

現在一般的に使用されているHTTP1.1ではHostヘッダーは必須のヘッダーなので、そいつを利用するわけです。

なんで400で返すの?

Hostヘッダーが無い場合は400で応答すべきとRFCに書いてあるのでそれに従います。

存在しないHost(この場合は127.0.0.1)にアクセスがあった場合も同様に400を返さなければならないとRFCに書いてあるので、そちらもそれに従います。

はよコード

ご納得のゆくまでご閲覧ください。

重要なのはuse関数です。


var express = require('express');
var app = express();
/*
* use関数でミドルウェアを登録する.
*
* リクエストの処理に先立ちここで登録した関数が
* 実行されるのでリクエストをフックするような感じで使用出来る.
*
* リクエストの処理というのは下にあるapp.get()やここでは使用してないが、
* app.post()などのことである.
*
*/
app.use(function(req, res, next){
/* リクエストに含まれるHostヘッダーを取得. */
var hostname = req.headers.host;
if( hostname == null || hostname == undefined ){
/*
* HostヘッダーはHTTP1.1では必須なので
* ない場合は400にする.
*/
res.send(400);
return;
}
/*
* Hostがlocalhostへのアクセスだったらリクエストを処理する.
* next()を呼ぶことで、下のapp.get()の部分が処理される.
*
* Hostがlocalhostへのアクセスで無い場合.
* 例えば127.0.0.1などIPアドレス直打ちの場合は400を返して終了する.
* 下のapp.get()は処理されない
*/
if(hostname.match(/^localhost/) != null){
next();
}else{
res.send(400);
}
});
app.get('/', function(req, res){
res.send("Hello");
});
app.get('/hello', function(req, res){
res.send("world");
});
app.listen(8080);
view raw express_host.js hosted with ❤ by GitHub

検証した

0 件のコメント:

コメントを投稿