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
)。