2012-05-09 12 views
2

私はウェブサーバを稼働させています...そして、別のサーバからカールした場合。次のようなものがあります。Node.js漏洩経路情報、どのようにそれを解決する?

curl http://myserver.com/../../../../../etc/rsyslog.conf 

私はサーバー情報を見ることができます。

これは既知の問題ですか?

var urlSecurity = function() { 
    return function (req, res, next) { 
     if (req.url.indexOf('../') >=0) { 
      res.send('<div>Server Error</div>' , 500); 
     } else if (req.url.indexOf('/..') >=0) { 
      res.send('<div>Server Error</div>' , 500); 
     } else { 
      next(); 
     } 
    } 
} 
app = express.createServer(
urlSecurity(), 
      gzip.staticGzip(__dirname + '/public', {maxAge:5000 }), 
      express.cookieParser(), 
      express.bodyParser() 

     ); 

が、これは十分です:

app = express.createServer(
      gzip.staticGzip(__dirname + '/public', {maxAge:5000 }), 
      express.cookieParser(), 
      express.bodyParser() 

     ); 

はそのような修正を得た:


UPDATE は、ここでは私のサーバーのコードですか?

+1

はい、ディレクトリトラバーサルは、Webサーバーの1日目以降の問題です。 –

+0

これを止める方法はありますか? – murvinlai

答えて

3

あなたのプログラムに深刻なセキュリティ欠陥があります。すぐに修正してください。これは非常に賢明ではありません

http.createServer(function (request, response) { 
    var file = path.resolve('/path/to/files', request.url) 
    fs.createReadStream(file).pipe(response) 
}) 

:提示症状から

私の最高の推測では、あなたのような何かをやっているということです!ユーザー入力を常に消毒する。この場合、それは非常に簡単です:

http.createServer(function (request, response) { 
    var requestedFile = path.join('/', request.url); 
    var file = path.join('/path/to/files', requestedFile) 
    fs.createReadStream(file).pipe(response) 
}) 

だから、最初に我々は '/'に要求されたURLを path.join。これはどんな汚れも取り除き、衛生的にします。その後、私たちのURLにそれを path.join

なぜこの場合はpath.resolveではなくpath.joinを使用しますか? path.joinはそれらを解決するのではなくパス部分を結合するだけなので、先導/は悪影響を受けません。

+0

私はそれを持っていません。私の更新を見てください。 :) – murvinlai

+4

>これは、より衛生的な汚れを取り除きます。 いいえ、それはしません。上記のコードはまだ安全ではありません。 –

2

すぐに修正した後、私は多くのテストを行いました。次のことを確認します:

これは主にノードの問題ではありません。これは問題を引き起こすgzippoモジュールです。 Gzippo 0.1.3がその問題を引き起こしています。 0.1.4は問題ありません。なぜそういうのでしょうか?古いバージョンのgzippoを使用しない方が良いでしょう。

0

最も簡単な解決策は、insecureFileName.split('/').pop()は常にfileNameだけを返します。

'index.html'.split('/').pop() => 'index.html' 
'../../../index.html'.split('/').pop() => 'index.html' 
関連する問題