2016-03-23 16 views
2

私は自分の目的のために純粋な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); 
    }); 
}); 

だから私はこのようなことから守る最良の方法は何ですか?

答えて

1

ウェブファイルのルートが/web/filesで、その階層外のリクエストが処理されないようにしたいとします。あなたは、このような結果のパスを確認することで、すべての...を処理するためにpath.normalize()を使用することができます。

var path = require('path'); 

var file_path = '/web/files' + request.url; 
var resolvedPath = path.normalize(file_path); 
if (resolvedPath.indexOf('/web/files/') !== 0) { 
    // illegal request 
} 

あなたはおよそpath.normalize()hereを読むことができます。パス内のすべての...セグメンテーションを解決するので、実際のパスがどのように見えるかを確認し、それが正当なパスであるかどうかを確認できます。


あるいは、効用関数の:私は純粋なJSでそれをやろうとしている上に書いたように

var webFiles = '/web/files'; 
var file_path = webFiles + request.url; 
if (!isPathContained(file_path, webFiles)) { 
    // illegal request 
} 
+0

私は、この解決策が/ web/filesの下にあるツリーへのシンボリックリンクを、そのツリーの外にあるファイルとディレクトリに対して処理するとは思っていません。シンボリックリンクがないことを確認できる状況では、おそらく妥当なトレードオフになります。 –

+1

@DavePacheco - これは、パブリックツリー内のシンボリックリンクがツリーの外側に解決されるのを防ぐものではありません。しかし、自分のパブリックファイルツリーにシンボリックリンクを置くと、それはあなた自身の意図でなければなりません。自分のパブリックツリーにシンボリックリンクを入れたくない場合は、明らかにそこに置かないでください。だから、私はこの問題を解決するコードは、シンボリックリンクが動作しないようにする必要はないと考えています。ターゲットファイルシステムはプログラマによって制御されているので、ここでは余分なステップ(およびファイルシステムへのアクセス)が必要とは思われませんが、 'fs.realPath()'を使ってシンボリックリンクを解決することもできます。 – jfriend00

+0

合意しましたが、これに対処するためにfs.realPath()を使用すると競合状態が発生します。 –

1

これにはExpress.js Static Filesを使用してください。

+0

var path = require('path'); function isPathContained(testPath, containerPath) { var resolvedPath = path.normalize(fullPath); return resolvedPath.indexOf(containerPath) === 0; } 

その後、あなたはこのようにそれを使用します。 – Kiril

関連する問題