私は Web サーバー フレームワーク (Node.JS で) を作成しています。パス トラバーサルをビルトイン機能として含めて、アプリが必要ないようにしたいと考えています。おそらく、これはパス トラバーサルから保護するための決定的なガイドになる可能性があるため、私以外の開発者にも役立つでしょう。
複数の OS で UTF エンコードされた文字を処理する方法が明確で理解しやすいため、このコードが気に入っています。これは完全に正しいと思いますが、まず皆さんに確認したいと思います。
クライアントから を取得
path
し、クエリ文字列から分離して、最初の文字が であることを確認します/
。Path に が含まれている場合は
%2f
、HTTP 403 をクライアントに送信して停止します。お使いの言語で実行
path=decodeURIComponent(path)
または同等の機能を実行します。入力が無効なために失敗した場合はスキップします言語の実行
path=encodeURIComponent(path)
または同等の機能 (関数は文字のみを出力する必要があり、最初の文字はまたはのままにしておく必要があります) を実行して、印刷可能な ASCII 文字 (定義上、文字攻撃を防止します) のみを確認します。\x20-\x7e
/
%2f
NUL
%2f
具体的にはに置き換え/
ます。大文字と小文字を区別せずにすべて置き換えます~私が好きな他の文字(
+
、&
、 など=
)についても同じことを行います-リストを印刷可能なASCII文字(\x20-\x7e
)のみに制限し(セキュリティのため)、スキップし%25
ます(一貫性のため)。必要に応じて正規表現を使用して、パス トラバーサルをきれいにクリーンアップします。(
/test/../bob
ちょうどなるようなもの/bob
)。最初の文字が/
.次の正規表現を使用して、明らかな方法でパス トラバーサルから保護します
s/\/\.?\.(?=\/|$)/\//g
。(許可/..foobar/
、ブロック中/../
) - 最初だけでなく、すべてを交換してください!
それで、あなたはどう思いますか?
これらは私が対処しているセキュリティ項目ですが、別の項目に対処する必要がある場合は教えてください.
- キャラクターの攻撃を防ぐ
NUL
(アイテム 4) - 拡張 Unicode 文字の一貫性のない OS 処理で発生する可能性のある改ざんをさらに防止する (項目 4)
- パス トラバーサルの脆弱性を明白で読みやすい方法で防止する (項目 8)
- 不正な相対 URL パスの原因となる改ざんを防止する (項目 2 および項目 7)
項目 7 は切り捨てが発生しないことを前提としていることに気付きましたが、それで問題ないと思います。最悪の場合、 は/...longstuff/..foo
に切り捨てられます。これは(右?)/...longstuff/..
と同等です。/.