1

メンバーのプロフィール画像セクションをアップロードしている私のウェブサイトと私は次のコードを使用しました。

フォームコード

<form action="send.php" method="post" enctype="multipart/form-data" name="send" id="send">
    Your Image : <input type="file" name="pic" id="pic"/>
    <input type="Submit" name="Submit" value="Submit"/>
</form>

PHPコードsend.php

$ImageName = $_FILES[pic][name]; 
if(!empty($ImageName) && $_FILES[pic][type] == "image/jpeg" || $_FILES[pic][type] == "image/png" || $_FILES[pic][type] == "image/gif" || $_FILES[pic][type] == "image/bmp"){
    $t = time();
    $NewImageName = "$t$ImageName"; // image new name
    copy($_FILES[pic][tmp_name], "users/$NewImageName"); // copy it to directory
} else {
    echo "no upload done";
}

しかし、Firefox拡張機能を使用している誰かがそれをバイパスしてphpファイルをアップロードしました私のウェブサイトにファイルをアップロードした人は、「タイプをチェックするだけです!」というメッセージを送ってくれました。「入力フィールドを偽造してPHPファイルを渡すことができるFirefox拡張機能を使用しました」と述べました。

だから私の質問はどうすれば上記のコードの画像アップロードフォームを保護できますか?〜ありがとう

4

2 に答える 2

3

まず、それが$_FILE変数を読み取るための有効な形式ではないと思います

$ImageName = $_FILES[pic][name]; 

あなたは使用する必要があります

$ImageName = $_FILES['pic'][name];

そうすると、誰かがサーバー側のチェックを偽造できる可能性は低いと思います。

これをハックしてみてください。PHP.netマニュアルに記載されているように*PATHINFO_EXTENSION*を使用します

$validFormat = array("jpg","JPG","jpeg","JPEG","png","PNG","gif","GIF");    
$path = pathinfo($_FILES['pic']['name'], PATHINFO_EXTENSION);
if(in_array($path, $validFormat)){
// it's okay
}else{
// Error
}

しばらく前にpathinfoを発見し、誰もそれをハックしていないので、私はこのコードを使用しています。

于 2013-02-02T09:52:28.570 に答える
3

配列の"type"エントリは、$_FILES実際にはクライアントが送信した値にすぎません。それらを信用しないでください。

ファイルは、クライアントによって指定されたMIMEタイプ(またはデータから認識されるMIMEタイプ)に基づいてではなく、単に拡張子によってphpとして実行されます。

$imageName = $_FILES['pic']['name'];

if (isset($imageName)) {
    $ext = pathinfo($imageName, PATHINFO_EXTENSION);
    if (in_array(strtolower($ext), array('jpg', 'jpeg', 'gif', 'png', 'bmp')) {
        $t = time();
        $newImageName = $t . basename($imageName);
        copy($_FILES['pic']['tmp_name'], 'users/' . $newImageName);
    }
} else {
    echo 'no upload done';
}

pathinfo拡張機能を取得し、パストラバーサル攻撃basenameを回避するための呼び出しに注意してください。

于 2013-02-02T09:56:14.420 に答える