説明
リクエストの入力をファイルパスに直接組み込み、File.ReadAllText、File.WriteAllText、FileStream などに渡すと、意図したディレクトリの外にあるファイルを読み書きされるおそれがあります。
想定される影響
- 設定ファイル、秘密情報、ソースコードの漏えいや、任意のファイルへの書き込みにつながる可能性があります。
対処方法
パスを正規化し、基準となるディレクトリ内に収まることを確認します。可能なら、許可リストにあるファイル名だけを受け入れてください。
例
変更前
csharp
var path = Path.Combine(baseDirectory, filename);
var content = File.ReadAllText(path);
変更後
csharp
var safeName = Path.GetFileName(filename);
var path = Path.Combine(baseDirectory, safeName);
var content = File.ReadAllText(path);
説明:
- 変更前: ユーザーが制御するパスの要素により、意図したディレクトリの外を読み書きされるおそれがあります。
- 変更後:
Path.GetFileNameで最後のファイル名部分だけを使います。攻撃者が基準ディレクトリやその中のファイル・リンクを変更できないことが前提です。アクセス先を特定のファイルに限定する場合は、ファイル名を許可リストでも検証してください。