- Path Traversal対策は「ファイルシステムを攻撃から守るための必須防御」です
- Path Traversal攻撃の仕組みをかみ砕いて理解する
- ステップ1:基本方針「ユーザー入力でディレクトリを自由に移動させない」を徹底する
- ステップ2:安全なファイル名に変換するユーティリティ
- ステップ3:ベースディレクトリ配下に限定した安全なパスを作る
- ステップ4:安全なファイル読み書きユーティリティのテンプレート
- ステップ5:例題で動きを確認する
- ステップ6:拡張子や種類を制限する(深掘り)
- ステップ7:Path Traversal対策で絶対にやってはいけないこと
- ステップ8:実務的ベストプラクティス
- まとめ:Path Traversal対策ユーティリティは「ファイルシステムを守るための堅牢なゲート」
Path Traversal対策は「ファイルシステムを攻撃から守るための必須防御」です
業務システムやWebアプリケーション、API、バッチ処理などでファイルを扱う読者のみなさんにとって、 Path Traversal(パストラバーサル)攻撃は、見落とされがちですが非常に危険な脆弱性です。 ユーザー入力をそのままファイルパスに使ってしまうと、 攻撃者が ../ などを使って意図しないディレクトリにアクセスし、 機密ファイルの読み取りや上書き、削除などにつながる可能性があります。
ここでは、プログラミング初心者の方にも分かるように、 C#で実務的に使える Path Traversal対策ユーティリティ をステップバイステップで解説し、 例題・コード・テンプレートを交えて詳しく説明していきます。
Path Traversal攻撃の仕組みをかみ砕いて理解する
何が危険なのか
典型的な危険なコードは次のようなものです。
string baseDirectory = "/var/app/uploads";
string fileName = GetUserInput(); // ユーザー入力
string path = Path.Combine(baseDirectory, fileName);
string content = File.ReadAllText(path);
C#一見すると問題なさそうですが、 fileName に次のような文字列が入っていたらどうなるでしょうか。
../../etc/passwd
すると、Path.Combine の結果は /var/app/uploads/../../etc/passwd となり、 GetFullPath で解決すると /etc/passwd のような「本来アクセスしてはいけないファイル」に到達してしまう可能性があります。
これがPath Traversal攻撃です。
