Bien le bonjour/bonsoir,
J'code actuellement un script permettant à l'utilisateur d'uploader une image. En revanche, question sécurité je doute un peu sur quelques points. Je suis conscient que c'est possible de modifier le fichier en local de telle façon que les entêtes d'image soient valides aux yeux de fonction d'image et que le fichier contienne du code malveillant/malicieux.
J'ai configuré NGINX pour rejeter les requêtes directes vers les assets (403) et je permet l'accès par un autre moyen avec un ?a=node_modules/semantic-ui-css/semantic.min.css
(par exemple) qui fera une lecture du fichier en question et enverra un Etag avec le fichier.
Pour le code concernant l'upload (pas complet mais pas loin de la complétion), le voici
$avatar_info = $_FILES['avatar'];
$return = [
true,
[]
];
// Une erreur lors de l'upload ?
if($avatar_info['error'] != UPLOAD_ERR_OK){
$return[0] = false;
$return[1][] = 'Une erreur est survenue lors de l\'upload';
return $return;
}
// L'extension est bonne ?
$allowed = ['jpg', 'png'];
$extension = strtolower(pathinfo($avatar_info['name'], PATHINFO_EXTENSION)); // strtolower because can be uppercased
if(!in_array($extension, $allowed)){
$return[0] = false;
$return[1][] = "L'extension est invalide";
}
// Check the filesize
if($avatar_info['size'] > 5000000){
$return[0] = false;
$return[1][] = "Le fichier est trop grand";
}
// Check the content
$unsafe = ['<?php', '?>', 'eval']; // << Ajouter des "expressions" à trouver
// Si le test d'unsafe passe et qu'il n'y a pas d'erreur à la fin, redimensionner l'image à 200x200 en PNG pour être "malicious code" free
Si quelqu'un a des expressions qui laisse à présager qu'un fichier est "unsafe"/malicieux, je prends volontiers.
Salut,
tu peux aussi renommer aléatoirement le fichier.
exemple: j'importe lapin.jpg => tu le renomme en cFuds78.jpg
Donc en pratique, j'ai locké le répertoire des assets donc les mec qui uploadent leur trucs malicieux devraient ne pas pouvoir exécuter leur code. C'est déjà une bonne chose. Ensuite, j'ai également prévu de faire un petit rename du fichier au moment du stockage.
En gros j'ai pas besoin d'aller check le contenu du fichier.