What alternative methods can be used to validate uploaded files in PHP, considering the unreliability of MIME types?

The issue with relying solely on MIME types to validate uploaded files in PHP is that they can be easily manipulated by an attacker. To address this, we can use alternative methods such as file extensions, file signatures, or content sniffing to validate the uploaded files.

// Validate uploaded file using file extension
$allowedExtensions = ['jpg', 'jpeg', 'png', 'gif'];
$uploadedFileExtension = pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION);

if (!in_array($uploadedFileExtension, $allowedExtensions)) {
    die("Invalid file extension. Allowed extensions are: " . implode(', ', $allowedExtensions));
}

// Validate uploaded file using file signature
$allowedSignatures = ['FFD8FF', '89504E47', '47494638', '49492A00'];
$fileSignature = file_get_contents($_FILES['file']['tmp_name'], null, null, 0, 4);

if (!in_array(bin2hex($fileSignature), $allowedSignatures)) {
    die("Invalid file signature.");
}

// Validate uploaded file using content sniffing
$finfo = finfo_open(FILEINFO_MIME_TYPE);
$mimeType = finfo_file($finfo, $_FILES['file']['tmp_name']);

if (!in_array($mimeType, ['image/jpeg', 'image/png', 'image/gif'])) {
    die("Invalid file type.");
}

// If all validations pass, move the uploaded file to the desired location
move_uploaded_file($_FILES['file']['tmp_name'], 'uploads/' . $_FILES['file']['name']);