私は自分の目的のために純粋なNodeJSでシンプルなサーバーを開発しようとしています。私が最近気づいた問題は、ローカルマシン上のWebからupperまたは他の場所に行く可能性があるということです。パスに../../../
のようなものを追加してください。私のサーバーは次のようになります:NodeJSのupperへのリクエストurlを保護する方法は?
var server = require('http').createServer(function(request, response) {
var file_path = './web' + request.url;
if (file_path == './web/')
file_path = file_path + 'index.html';
var extname = path.extname(file_path);
switch (extname) {
case '.js':
content_type = 'text/javascript';
break;
case '.css':
content_type = 'text/css';
break;
case '.json':
content_type = 'application/json';
break;
default:
content_type = 'text/html';
break;
}
fs.readFile(file_path, 'utf8', function (err, data) {
if (err) {
response.writeHead(404);
return response.end('Error loading ' + request.url);
}
response.writeHead(200, {'Content-Type': content_type});
return response.end(data);
});
});
だから私はこのようなことから守る最良の方法は何ですか?
私は、この解決策が/ web/filesの下にあるツリーへのシンボリックリンクを、そのツリーの外にあるファイルとディレクトリに対して処理するとは思っていません。シンボリックリンクがないことを確認できる状況では、おそらく妥当なトレードオフになります。 –
@DavePacheco - これは、パブリックツリー内のシンボリックリンクがツリーの外側に解決されるのを防ぐものではありません。しかし、自分のパブリックファイルツリーにシンボリックリンクを置くと、それはあなた自身の意図でなければなりません。自分のパブリックツリーにシンボリックリンクを入れたくない場合は、明らかにそこに置かないでください。だから、私はこの問題を解決するコードは、シンボリックリンクが動作しないようにする必要はないと考えています。ターゲットファイルシステムはプログラマによって制御されているので、ここでは余分なステップ(およびファイルシステムへのアクセス)が必要とは思われませんが、 'fs.realPath()'を使ってシンボリックリンクを解決することもできます。 – jfriend00
合意しましたが、これに対処するためにfs.realPath()を使用すると競合状態が発生します。 –