0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

サニタイズとは?バリデーションとは?パストラバーサルを防ぐ👊

Last updated at Posted at 2026-01-14

はじめに

「ファイル名をサニタイズまたはバリデーションしてください。」

AIによるコードレビューでこのような指摘を受けました。

サニタイズという言葉を知らなかったので、関連する内容も含めて調べました!

💡この記事でわかること

  • パストラバーサルの仕組み
  • サニタイズとは何か
  • バリデーションとは何か

なお、今回のケースではユーザーから受け取ったファイル名を使用しない実装にしました🐣

パストラバーサルとは

パストラバーサルとは、本来アクセスできないWebルートフォルダ外に保存されているファイルやディレクトリにアクセスする攻撃手法です。ディレクトリトラバーサルともいいます。

traversal は「横断する」という意味を持ちます。

攻撃の仕組み

例えば、商品画像を表示するWebアプリケーションがあるとします。/loadImage というURLは filename パラメータを受け取り、指定されたファイルの内容を返します。

通常のリクエスト:画像ファイルを返す

/loadImage?filename=image.png

攻撃リクエスト: /etc/passwd を返してしまう

/loadImage?filename=../../../etc/passwd

../ はファイルパス内で「1つ上のディレクトリに移動する」ことを表します。
../ を繰り返すことで、本来アクセスできないディレクトリまで遡ることができてしまいます。
Windowsの場合は、 ../..\ の両方でディレクトリを遡ることができます。

攻撃の被害

パストラバーサルによって、以下のような被害を受ける可能性があります

  • 情報漏えい
  • 設定ファイル、データファイル、プログラムの改ざん、削除

サニタイズとは

サニタイズとは、入力データから特定の文字列を変換・削除して、安全なデータにすることです。

sanitize は「消毒する」「不適切な部分を削除する」という意味を持ちます。

例: ../ を削除して無害化する

const input = '../../../etc/passwd';
const sanitized = input.replace(/\.\.\//g, '');
console.log(sanitized); // 'etc/passwd'

バリデーションとは

バリデーションとは、入力データの形式・種類・長さがルールや要件に合っているか確認することです。

validate は「検証する」「正当性を立証する」という意味を持ちます。

例:英数字、アンダースコア、ハイフン、ドットのみを許可する

const input = 'Pass Word1111'; // スペースが含まれている
const isValid = /^[a-zA-Z0-9_\-\.]+$/.test(input);
console.log(isValid); // false

サニタイズとバリデーションの違い

サニタイズ バリデーション
目的 悪意のある入力を無害化する 入力が期待通りかを確認する
処理 危険な文字を削除・変換する 不正な入力を拒否する
結果 入力データを変換して使用する 入力データを受け入れるか判定する
注意点 入力の正しさは保証しない 未知のパターンを防げない

パストラバーサルの対策方法

ユーザー入力をファイルパスに使用しない

最も効果的な方法は、ユーザー入力の値をファイル名として使用しないことです。

ユーザー入力をファイル名に使用する実装が本当に必要か、他の方法で代替できないか検討しましょう。

入力値をバリデーションする

ユーザー入力を使用する必要がある場合は、許可リスト方式でバリデーションを行います。

OWASPでは、許可リスト方式と拒否リスト方式について以下のような記述があります。

While denylisting can be useful as an additional layer of defense to catch some common malicious patterns, it should not be relied upon as the primary method. Allowlisting remains the more robust and secure approach for preventing potentially harmful input.

拒否リスト方式は、一般的な悪意のあるパターンを検出するための追加の防御層として有用ですが、主要な方法として依存すべきではありません。許可リスト方式は、潜在的に有害な入力を防ぐためのより堅牢で安全なアプローチです。

⚠️ サニタイズだけでは不十分

../ を単純に削除するサニタイズでは、以下のような入力を防ぐことができません。

入力例 説明
....// 内側の ../ が削除されても ../ が残る
%2e%2e%2f URLエンコードされた ../
%252e%252e%252f 二重URLエンコードされた ../
..%c0%af 非標準エンコード

そのため、OWASPはサニタイズではなく、許可リスト方式のバリデーションを推奨しています。

まとめ

パストラバーサルは、../ などの文字列を使って本来アクセスできないファイルやディレクトリにアクセスする攻撃です。

対策としてサニタイズやバリデーションがありますが、目的が異なります。

  • サニタイズ:危険な文字を除去して無害化する
  • バリデーション:許可された入力のみを受け入れる

参考

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?