What are the best practices for securely storing and processing user-uploaded files, such as PDFs, in a PHP-based system?

User-uploaded files, such as PDFs, can pose security risks if not handled properly. To securely store and process these files in a PHP-based system, it is important to validate file types, sanitize file names, store files outside the web root directory, use secure file permissions, and scan files for malware before processing.

// Validate file type
$allowedTypes = ['pdf'];
$uploadedFileType = pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION);
if (!in_array($uploadedFileType, $allowedTypes)) {
    die('Invalid file type. Only PDF files are allowed.');
}

// Sanitize file name
$fileName = preg_replace("/[^A-Za-z0-9.]/", '', $_FILES['file']['name']);

// Store file outside web root directory
$uploadDir = '/path/to/uploaded/files/';
$filePath = $uploadDir . $fileName;
move_uploaded_file($_FILES['file']['tmp_name'], $filePath);

// Set secure file permissions
chmod($filePath, 0644);

// Scan file for malware before processing
if (exec("clamscan --no-summary $filePath")) {
    die('File contains malware. Upload failed.');
}

// Process the uploaded file
// Add your processing logic here