現在の位置: ホーム> 最新記事一覧> GD2画像をロードするときにパストラバーサル攻撃を防ぐ方法

GD2画像をロードするときにパストラバーサル攻撃を防ぐ方法

M66 2025-05-18

PHPのImageCreateeFromGD2関数を使用してGD2画像をロードする場合、入力パスが正しく処理されていない場合、パストラバーサル攻撃に遭遇する可能性があります。攻撃者は、特定のパスを構築することにより、サーバー上の機密ファイルにアクセスできます。したがって、パストラバーサル攻撃を正しく防ぐことが非常に重要です。この記事では、そのような攻撃を効果的に防止する方法について説明します。

1。経路横断攻撃とは何ですか?

パストラバーサル攻撃とは、攻撃者が、../類似のメソッドを含むパスを構築し、公開してはならないファイルにアクセスすることにより、ファイルシステムのセキュリティ制御をバイパスしようとすることを指します。 PHPでは、 ImageCreateeFromGD2関数が正しい検証パスなしで画像をロードすると、サーバーのロード上の機密情報の漏れにつながる可能性があります。

2。imageCreatefromgd2関数を使用して画像をロードします

ImageCreateFromGD2関数は、GD2形式の画像ファイルから画像リソースを作成するためにPHPによって提供される関数です。基本的な使用方法は次のとおりです。

 $image = imagecreatefromgd2($filename);

この関数は、ファイルパスパラメーター$ filenameを取得し、画像リソースを返します。パスが正しくない場合、またはファイルがアクセスできない場合、通常、 falseは返されます。

3。経路横断攻撃のリスク

攻撃者は、次のようなファイルパスを変更することにより、セキュリティ制限をバイパスできます。

 $image = imagecreatefromgd2('/var/www/html/uploads/../../etc/passwd');

上記の例では、攻撃者は、パスの../の一部を介してサーバー上の/etc/passwdファイルにアクセスし、機密情報を漏らしようとします。

4.パストラバーサル攻撃を防ぐ方法は?

パストラバーサル攻撃を防ぐために、ユーザーが入力したパスを厳密に検証およびフィルタリングする必要があります。ここにいくつかの効果的な予防措置があります。

4.1ファイルパスを確認します

まず、ファイルパスが信頼できることを確認してください。 PHPのRealPath()関数を使用して、相対パスを絶対パスに変換し、予想ディレクトリにあることを確認できます。 RealPath()関数は、正規化された絶対パスを返し、すべてのシンボリックリンクを解析します。

 $filename = '/var/www/html/uploads/' . $_GET['filename']; // ユーザーが入力したファイルパスを取得します
$realpath = realpath($filename);

if ($realpath && strpos($realpath, '/var/www/html/uploads/') === 0) {
    // パスは有効です,許可されたディレクトリ内
    $image = imagecreatefromgd2($realpath);
} else {
    // 無効なパス,ロードを拒否します
    echo "Invalid file path!";
}

上記のコードでは、最初にRealPath()関数を使用してファイルの絶対パスを取得し、次に/var/www/html/uploads/ directoryにあるかどうかを確認します。そうでない場合は、ファイルのロードを拒否します。

4.2ホワイトリストを使用してファイル名を検証します

アップロードしてロードされることが許可されているファイル名は、ホワイトリストに限定できます。これにより、悪意のあるファイルがアップロードされてロードされなくなります。

 $allowed_files = ['image1.gd2', 'image2.gd2']; // ホワイトリスト
$filename = $_GET['filename'];

if (in_array($filename, $allowed_files)) {
    $image = imagecreatefromgd2('/var/www/html/uploads/' . $filename);
} else {
    echo "File not allowed!";
}

4.3シンボリックリンク攻撃を防ぎます

Symlinksは、パストラバーサル攻撃を実行するために使用できます。ファイルパスが物理的に存在し、 RealPath()を使用してシンボリックリンクが含まれていないことを確認できます。これにより、シンボリックリンクを介してアクセスしてはならないファイルへのアクセスを防ぎます。

 $filename = '/var/www/html/uploads/' . $_GET['filename'];
$realpath = realpath($filename);

if ($realpath && strpos($realpath, '/var/www/html/uploads/') === 0 && !is_link($realpath)) {
    // パスは有効です,そして、象徴的なリンクはありません
    $image = imagecreatefromgd2($realpath);
} else {
    echo "Invalid file path or symbolic link detected!";
}

5。概要

PHPのImageCreateFromGD2関数を使用してGD2画像をロードする場合、パストラバーサル攻撃の防止が重要です。このような攻撃のリスクは、ファイルパスを検証し、ホワイトリストを使用したり、シンボリックリンクをチェックするなどしたりすることで効果的に軽減できます。常にサーバーのセキュリティを確保し、パストラバーサルの脆弱性による機密データ侵害またはサーバー攻撃を回避してください。