PHP画像とGIFをアップロードする安全な方法

Aug 20 2020

私はソーシャルネットワークを作成していますが、これが写真/ GIFやビデオをアップロードする安全な方法であるかどうかを知りたいです。

if(isset($_POST['post'])) { $uploadOk = 1;
    $imageName = $_FILES['postToUpload']['name'];
    $errorMessage = ""; $picdate = date('Y-m-d_H-i-s');

    if($imageName != "") { $targetDir = "assets/images/posts/";
        $imageName = $targetDir . uniqid() . basename($imageName); $imageFileType = pathinfo($imageName, PATHINFO_EXTENSION); if($_FILES['postToUpload']['size'] > 10971520) {
            $errorMessage = "Your file is to large"; $uploadOk = 0;
        }

        if (strtolower($imageFileType) != "jpeg" && strtolower($imageFileType) != "png" &&
            strtolower($imageFileType) != "jpg" && strtolower($imageFileType) != "gif"
            && strtolower($imageFileType) != "mp4"&& strtolower($imageFileType) != "Ogg"
            && strtolower($imageFileType) != "WebM"){ $errorMessage = "File type not allowed.";
            $uploadOk = 0; } if($uploadOk){
            if(move_uploaded_file($_FILES['postToUpload']['tmp_name'], $imageName)) {
                // image uploaded

            } else{
                // image did not upload
                $uploadOk = 0; } } } if($uploadOk) {

    $post = new Post($con, $userLoggedIn); $post->submitPost(trim(strip_tags(filter_var($_POST['post_text'], FILTER_SANITIZE_STRING))), 'none', $imageName);

    } else {

        echo "<div class='alert alert-danger'>
                $errorMessage
            </div>";
    }
}

回答

2 Victor Sep 11 2020 at 20:56

次の理由により、コードは安全ではありません。

  • ファイル拡張子のみに依存しているため、攻撃者は任意のバックドアをアップロードできます。
  • $_FILES['postToUpload']['name']定義されているかどうかを確認せずに変数にアクセスするため、フルパス開示につながる可能性があります。
  • uniqid()引数なしで関数を使用するため、一意性は保証されず、同時にアップロードされ、同じファイル名を持つファイルは上書きされます。
  • 潜在的に危険な文字を削除せずにユーザーが提供したファイル名を保存します。これにより、予期しない結果が生じる可能性があります。

コードを改善するためのいくつかの推奨事項:

  • $uploadOk変数を取り除きます。すでに$errorMessage変数を持って処理しており、ファイルが正常にアップロードされたかどうかを確認するにはこれで十分です。
  • 各拡張子$imageFileTypeを呼び出すのstrtolower()ではなく、小文字として定義する必要があります。
  • (あなたのケースではあなたはそれ以外の場合は、ユーザーができないいくつかのファイルをアップロードするだろう、小文字など、すべての受け入れのファイル拡張子を定義する必要がありますWebMし、Oggため、strtolower($imageFileType) != "Ogg"strtolower($imageFileType) != "WebM"いつもとなりますFALSE)。