Je vérifie l'extension du fichier pour le téléchargement ou non. i.e mes méthodes ont fonctionné mais maintenant je dois comprendre, mes méthodes (pathinfo) sont vraies? un autre moyen meilleur et plus rapide?! Merci
$filename = $_FILES['video_file']['name'];
$ext = pathinfo($filename, PATHINFO_EXTENSION);
if( $ext !== 'gif' || $ext !== 'png' || $ext !== 'jpg' ) {echo 'error';}
En utilisant if( $ext !== 'gif'
) pourrait ne pas être efficace si vous autorisez environ 20 extensions différentes
Essayer
$allowed = array('gif','png' ,'jpg');
$filename = $_FILES['video_file']['name'];
$ext = pathinfo($filename, PATHINFO_EXTENSION);
if(!in_array($ext,$allowed) ) {
echo 'error';
}
La vérification de l’extension du fichier n’est pas considérée comme une pratique recommandée. La méthode recommandée pour réaliser cette tâche consiste à vérifier les fichiers type mime .
De PHP:
<?php
$finfo = finfo_open(FILEINFO_MIME_TYPE); // return mime type
foreach (glob("*") as $filename) {
echo finfo_file($finfo, $filename) . "\n";
}
finfo_close($finfo);
?>
L'exemple ci-dessus produira quelque chose de similaire à ce que vous devriez vérifier.
text/html
image/gif
application/vnd.ms-Excel
Bien que les types mime puissent également être piégés (éditer les premiers octets d’un fichier et modifier les nombres magiques), mais c’est plus difficile que d’éditer un nom de fichier. Par conséquent, vous ne pouvez jamais être sûr à 100% de la nature réelle de ce type de fichier et il convient de prendre des précautions lors du traitement des fichiers téléchargés/envoyés par courrier électronique par vos utilisateurs.
Personnellement, je préfère utiliser la fonction preg_match () :
if(preg_match("/\.(gif|png|jpg)$/", $filename))
ou in_array ()
$exts = array('gif', 'png', 'jpg');
if(in_array(end(explode('.', $filename)), $exts)
Avec in_array()
peut être utile si vous avez beaucoup d’extensions pour valider et poser des questions. Une autre façon de valider les images de fichier: vous pouvez utiliser @imagecreatefrom*()
, si la fonction échoue, cela signifie que l'image n'est pas valide.
Par exemple:
function testimage($path)
{
if(!preg_match("/\.(png|jpg|gif)$/",$path,$ext)) return 0;
$ret = null;
switch($ext)
{
case 'png': $ret = @imagecreatefrompng($path); break;
case 'jpeg': $ret = @imagecreatefromjpeg($path); break;
// ...
default: $ret = 0;
}
return $ret;
}
ensuite:
$valid = testimage('foo.png');
En supposant que foo.png
Soit un fichier de script PHP portant l'extension .png
, La fonction ci-dessus échoue. Il peut éviter des attaques telles que la mise à jour de Shell et LFI .
pathinfo est cool mais votre code peut être amélioré:
$filename = $_FILES['video_file']['name'];
$ext = pathinfo($filename, PATHINFO_EXTENSION);
$allowed = array('jpg','png','gif');
if( ! in_array( $ext, $allowed ) ) {echo 'error';}
Bien entendu, le simple fait de vérifier l’extension du nom de fichier ne garantirait pas le type de fichier en tant qu’image valide. Vous pouvez envisager d'utiliser une fonction telle que getimagesize
pour valider les fichiers image téléchargés.
le type de fichier peut également être vérifié d'autres manières. Je crois que c’est le moyen le plus simple de vérifier le type de fichier téléchargé. Si vous avez affaire à un fichier image, recherchez le code suivant. si vous avez affaire à un fichier vidéo, remplacez la vérification d'image par une vérification vidéo dans le bloc if .. amusez-vous
$ img_up = $ _FILES ['video_file'] ['type']; $ img_up_type = explode ("/", $ img_up); $ img_up_type_firstpart = $ img_up_type [ 0];
if ($ img_up_type_firstpart == "image") {// image est le type de fichier image, vous pouvez utiliser la vidéo si vous devez vérifier le type de fichier vidéo .
/ * fait votre code logique */ }
Pas sûr que cela aurait un temps de calcul plus rapide, mais une autre option ...
$acceptedFormats = array('gif', 'png', 'jpg');
if(!in_array(pathinfo($filename, PATHINFO_EXTENSION), $acceptedFormats))) {
echo 'error';
}
Pour y parvenir correctement, il serait préférable de vérifier le type mime.
function get_mime($file) {
if (function_exists("finfo_file")) {
$finfo = finfo_open(FILEINFO_MIME_TYPE); // return mime type ala mimetype extension
$mime = finfo_file($finfo, $file);
finfo_close($finfo);
return $mime;
} else if (function_exists("mime_content_type")) {
return mime_content_type($file);
} else if (!stristr(ini_get("disable_functions"), "Shell_exec")) {
// http://stackoverflow.com/a/134930/1593459
$file = escapeshellarg($file);
$mime = Shell_exec("file -bi " . $file);
return $mime;
} else {
return false;
}
}
//pass the file name as
echo(get_mime($_FILES['file_name']['tmp_name']));
je pense que cela pourrait fonctionner pour vous
//<?php
//checks file extension for images only
$allowed = array('gif','png' ,'jpg');
$file = $_FILES['file']['name'];
$ext = pathinfo($file, PATHINFO_EXTENSION);
if(!in_array($ext,$allowed) )
{
//?>
<script>
alert('file extension not allowed');
window.location.href='some_link.php?file_type_not_allowed_error';
</script>
//<?php
exit(0);
}
//?>
Comment valider l'extension de fichier (jpg/jpeg uniquement) sur un formulaire avant que le téléchargement ait lieu. Une variation d'une autre réponse publiée ici avec un filtre de données inclus peut être utile lors de l'évaluation d'autres valeurs de formulaire publiées. Remarque: l'erreur est laissée vide si vide, car il s'agissait d'une option pour mes utilisateurs et non d'une exigence.
<?php
if(isset($_POST['save'])) {
//Validate image
if (empty($_POST["image"])) {
$imageError = "";
} else {
$image = test_input($_POST["image"]);
$allowed = array('jpeg','jpg');
$ext = pathinfo($image, PATHINFO_EXTENSION);
if(!in_array($ext,$allowed) ) {
$imageError = "jpeg only";
}
}
}
// Validate data
function test_input($data) {
$data = trim($data);
$data = stripslashes($data);
$data = htmlspecialchars($data);
return $data;
}
<?
Votre html ressemblera à quelque chose comme ça;
<html>
<head>
</head>
<body>
<!-- Validate -->
<?php include_once ('validate.php'); ?>
<!-- Form -->
<form method="post" action="">
<!-- Image -->
<p>Image <?php echo $imageError; ?></p>
<input type="file" name="image" value="<?php echo $image; ?>" />
<p><input type="submit" name="save" value="SAVE" /></p>
</form>
</body>
</html>