Sto scrivendo uno script PHP che prende input da un modulo HTML5, inclusi i caricamenti, e li invia a un amministratore tramite il client di posta di Magento. Penso di aver trattato abbastanza bene le basi, ma sono sicuro che mi mancano alcune potenziali vulnerabilità perché non sono un esperto di sicurezza.
A partire da ora, i dati vengono inviati direttamente all'e-mail con l'eccezione dei file temporanei dai caricamenti HTML5. Non viene inviato a un database, quindi sto convalidando l'estensione del file, la dimensione del file, il numero del file, la lunghezza della stringa per altri input e l'utilizzo della funzione htmlspecialchars()
di PHP per evitare l'iniezione di HTML.
Qualcuno può segnalare alcune cose che potrei trascurare qui?
<?php
$maxfilesize = 1000;
$maxStringLength = 50;
if(isset($_POST['submit'])){
$drivers_license = $_FILES['drivers-license'];
$cfi_cert = $_FILES['cfi-cert'];
$cfi_multiple = false;
if(count($_FILES['cfi-cert']['name']) > 1){
if(count($_FILES['cfi-cert']['name']) > 2){
die('Invalid input')
}
$cfi_multiple = true;
$cfi_cert1['name'] = $_FILES['cfi-cert']['name'][0];
$cfi_cert1['type'] = $_FILES['cfi-cert']['type'][0];
$cfi_cert1['tmp_name'] = $_FILES['cfi-cert']['tmp_name'][0];
$cfi_cert1['error'] = $_FILES['cfi-cert']['error'][0];
$cfi_cert1['size'] = $_FILES['cfi-cert']['size'][0];
$cfi_cert2['name'] = $_FILES['cfi-cert']['name'][1];
$cfi_cert2['type'] = $_FILES['cfi-cert']['type'][1];
$cfi_cert2['tmp_name'] = $_FILES['cfi-cert']['tmp_name'][1];
$cfi_cert2['error'] = $_FILES['cfi-cert']['error'][1];
$cfi_cert2['size'] = $_FILES['cfi-cert']['size'][1];
}
//Remove special characters from text inputs
$ftn = htmlspecialchars($_POST['ftn']);
$phone = htmlspecialchars($_POST['phone']);
$email = htmlspecialchars($_POST['email']);
if(strlen($email) > $maxStringLength || strlen($phone) > $maxStringLength || strlen($ftn) > $maxStringLength){
die('Invalid input');
}
//Build attachments array, calling image validation function for each
$attachments = array();
imageValidationErrorCheck($drivers_license, $maxfilesize);
$attachments[] = $drivers_license;
if($cfi_multiple){
imageValidationErrorCheck($cfi_cert1, $maxfilesize);
$attachments[] = $cfi_cert1;
imageValidationErrorCheck($cfi_cert2, $maxfilesize);
$attachments[] = $cfi_cert2;
} else {
imageValidationErrorCheck($cfi_cert, $maxfilesize);
$attachments[] = $cfi_cert;
}
//Use Magento's email client
$mageFilename = '../app/Mage.php';
require_once($mageFilename);
Mage::app();
$mailTemplate = Mage::getModel('core/email_template');
$mailTemplate->setSenderName('Test Sender');
$mailTemplate->setSenderEmail('[email protected]');
$mailTemplate->setTemplateSubject('Processing');
$output .= "Email Address:<br>";
$output .= $email . "<br><br>";
$output .= "Phone Number:<br>";
$output .= $phone . "<br><br>";
$output .= "FTN:<br>";
$output .= $ftn . "<br><br>";
$mailTemplate->setTemplateText($output);
foreach($attachments as $attachment){
$mailTemplate->getMail()->createAttachment(
file_get_contents($attachment['tmp_name']),
Zend_Mime::TYPE_OCTETSTREAM,
Zend_Mime::DISPOSITION_ATTACHMENT,
Zend_Mime::ENCODING_BASE64,
$attachment['name']
);
}
$mailTemplate->send('[email protected]');
}
//Validate images
function imageValidationErrorCheck($file, $maxSizeKb){
$error = '';
$baseName = basename($file['name']);
$type = substr($baseName, strrpos($baseName, '.') + 1);
$sizeInKb = $file['size'] / 1024;
//Limit size to max file size
if($sizeInKb > $maxSizeKb){
die('Invalid input');
}
//Check file extension
$allowedExtensions = array("jpg", "jpeg", "gif", "bmp", "png", "tiff", "pdf", "doc", "docx");
if(!in_array(strtolower($type), $allowedExtensions)){
die('Invalid input');
}
}
?>