8
votes

Pourquoi certains MP3 sur MIME_Content_Type Demande de retour / octet-Stream

Pourquoi est-ce que sur certains fichiers MP3, quand j'appelle mime_content_type ($ mp3_file_path) Il renvoie l'application / octet-flux?

Ceci est mon code: P>

if (!empty($_FILES)) {
    $tempFile = $_FILES['Filedata']['tmp_name'];
    $image = getimagesize($tempFile);
    $mp3_mimes = array('audio/mpeg', 'audio/x-mpeg', 'audio/mp3', 'audio/x-mp3', 'audio/mpeg3', 'audio/x-mpeg3', 'audio/mpg', 'audio/x-mpg', 'audio/x-mpegaudio'); 
   
    if (in_array(mime_content_type($tempFile), $mp3_mimes)) { 
        echo json_encode("mp3");
    } elseif ($image['mime']=='image/jpeg') {
        echo json_encode("jpg");
    } else{
        echo json_encode("error");
    }
}


1 commentaires

Peut-être montrer du code? Ou quelques exemples de ces fichiers?


3 Réponses :


3
votes

Application / Octet-Stream est probablement MIME_Content_Type S Type de retombe quand il ne parvient pas à reconnaître un fichier.

Le MP3 Dans ce cas n'est pas un vrai fichier MP3, ni - plus probable - le fichier est un vrai fichier MP3, mais ne contient pas les "octets magiques" La fonction PHP utilise pour reconnaître le format - peut-être parce que c'est un sous-format différent ou a un débit variable ou autre.

Vous pouvez essayer si getid3 vous donne de meilleurs résultats. Je n'ai jamais travaillé avec cela, mais cela ressemble à une jolie bibliothèque saine pour obtenir de nombreuses informations à partir de fichiers multimédias.

Si vous avez accès à la configuration de PHP, vous pouvez également être en mesure de Modifiez le fichier mime.magic fichier PHP utilise, bien que je n'ai aucune idée si un meilleur fichier existe qui est capable de détecter vos mp3. (Le fichier mime.magic est le fichier contenant toutes les séquences d'octets que mime_content_type utilise pour reconnaître certains types de fichiers.)


1 commentaires

J'ai eu une chance de creuser dans getid3 et si je me souviens bien, il s'est avéré qu'il figure que le format de fichiers est uniquement sur des extensions.



11
votes

Les fichiers MP3 sont une bête étrange lorsqu'il s'agit de les identifier. Vous pouvez avoir un mp3 stocké avec un conteneur .wav. Il peut y avoir une en-tête ID3V2 au début du fichier. Vous pouvez intégrer un mp3 essentiellement dans n'importe quel fichier.

Le seul moyen de les détecter de manière fiable est d'analyser lentement dans le fichier et d'essayer de trouver quelque chose qui ressemble à une image MP3. Un cadre est la plus petite unité de données mp3 valides possibles et représente (sortie de mémoire) 0,028 secondes d'audio. La taille du cadre varie en fonction du débit et du débit d'échantillonnage, de sorte que vous ne pouvez pas simplement saisir le débit de débit / échantillon de la première image et supposer que tous les autres cadres seront la même taille - A vbr mp3 doit être analysé dans son intégralité calculer le temps de lecture total.

Tout cela revient à cet identifiant un MP3 en utilisant PHP's FileInfo et similaire n'est pas fiable, car les données MP3 réelles peuvent démarrer n'importe où dans un fichier. FileInfo ne regarde que le premier kilobyte ou deux de données, donc s'il est dit que ce n'est pas un MP3, il pourrait très bien être mené, car les données ont commencé légèrement plus loin.


2 commentaires

Alors, quelle est la solution?


Ajoutez une exception dans votre code / logique qui, lorsque vous constatez une extension de fichier .mp3 dans le nom de fichier, saut la détection de type MIME et l'assume à être audio / mp3 . Bien entendu, il s'agit d'un compromis et en fonction du cas d'utilisation (par exemple, si vous souhaitez une fiabilité à 100%, mais une détection plus lente) - Vous voudrez peut-être aller avec l'analyse lentement dans le fichier et essayer de trouver quelque chose qui ressemble à une image mp3 «Approche mentionnée dans la réponse.



0
votes

Fleep est la réponse à cette question. Autoriser l'application / l'octet-flux est dangereux car .exe et d'autres fichiers dangereux peuvent afficher avec ce type MIME.

Voir cette réponse https://stackoverflow.com/a/52570299/14482130


2 commentaires

Serait-ce un problème permettant d'autoriser l'application / octet-flux si vous utilisez IS_Executable pour interdire les exécutables avant de permettre certains types?


Je ne connais pas votre situation spécifique, je ne peux donc pas dire à coup sûr. Tout ce que je sais, c'est que permettre la demande d'application / octet sans que les contrôles supplémentaires soient potentiellement un danger énorme car vous n'avez vraiment aucune idée de ce que le fichier est. Cela pourrait littéralement être à peu près n'importe quoi. À mon œil, il vaincit complètement le but de la vérification de Mimetype en premier lieu si vous décidez d'autoriser l'application / le flux d'octet. Je ne sais pas comment est_s_exublicité fonctionne, je ne peux donc pas en garantir. J'ai trouvé que Fleep pouvait constater que c'était un fichier MP3, sans s'appuyer sur l'extension, malgré le mimetype montrant en tant que demande / piste d'octet.