Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

CONNAITRE SI LE FICHIER UPLOADER N'EST PAS UN FICHIER PHP


Information sur la source

Catégorie :Fichier / Disque Classé sous : fichier, type, upload Niveau : Débutant Date de création : 25/12/2006 Date de mise à jour : 26/12/2006 18:21:36 Vu : 4 680

Note :
4 / 10 - par 6 personnes
4,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (45)
Ajouter un commentaire et/ou une note

Description

simple fonction pour connaitre si le fichier uploader n'est pas un fichier php,

 

Source

  • <?php
  • function is_php($fichier)
  • {
  • if(!is_file($fichier))
  • return false;
  • return (bool)preg_match('~<\?[^xml]~i',file_get_contents($fichier));
  • }
  • ?>
<?php

function is_php($fichier)
{
    if(!is_file($fichier))
        return false;

    return (bool)preg_match('~<\?[^xml]~i',file_get_contents($fichier));
}

?>

Historique

26 décembre 2006 18:21:36 :
merci KANKRELUNE

Commentaires et avis

signaler à un administrateur
Commentaire de LocalStone le 26/12/2006 08:36:12

Bon, ça reste à verifier ce que je vais dire, mais c'est tout pourri ton truc. Si c'est un fichier XML bien formé, bah il va croire que c'est un fichier PHP. Qui plus est, un fichier PHP n'est pas censé commencé par <?, mais par <?php, non ?
++ !

signaler à un administrateur
Commentaire de Naixn le 26/12/2006 09:57:56

Bah en fait là, il ne fait que lire la première ligne.
Il suffirait que je fasse :

<html>
<head>
<title><?php echo $conf['title']; ?></title>
</head>
<body>
<?php

do_something();

?>
</body>
</html>

Et là, son truc ne marche pas...
Mais quoiqu'il en soit, ce serait vraiment porc de lire l'ensemble du fichier pour vérifier si c'est un fichier PHP.
Imaginez : si quelqu'un upload une vidéo de 500Mo, le script PHP va faire des fgets() en masse dessus ?

Bref, 1 pour la source.
Je doute même qu'elle ne reste très longtemps.

signaler à un administrateur
Commentaire de jdalton42 le 26/12/2006 11:05:32

Plus facile, simplement récupèrer l'extention... php n'execute que les fichiers dont l'extention est .php

signaler à un administrateur
Commentaire de Naixn le 26/12/2006 11:24:46

Ça dépend de la configuration Apache. C'est apache qui décide quel types de fichier sont à envoyer à PHP.
A mon boulot, par exemple, les fichiers HTML sont aussi envoyés à PHP.
De toute façon, la reconnaissance par l'extension n'a jamais été une bonne chose !

signaler à un administrateur
Commentaire de TheSin le 26/12/2006 11:40:05

Naixn, pourquoi vous envoyez aussi les fichiers HTML à PHP ? pour faire du PHP sans que le client ne le sache ?

signaler à un administrateur
Commentaire de audayls le 26/12/2006 12:35:39

Analyser les fichiers HTML par PHP, c'est en quelque sorte de l'URL Rewriting non ?

signaler à un administrateur
Commentaire de jdalton42 le 26/12/2006 12:51:40

rien a voir

signaler à un administrateur
Commentaire de Naixn le 26/12/2006 12:52:03

TheSin > Non, ça se devine bien qu'on utilise PHP, quand même.
Pendant un temps, c'était pour le référencement mais bon...
Mais en fait là, maintenant, les fichiers html, tu peux renommer en php c'est pareil, y'a des tags <?php ?> etc.

Enfin c'est pas moi qui ai choisi hein ! C'était déjà comme ça avant que j'arrive en fait =)

signaler à un administrateur
Commentaire de amezghal le 26/12/2006 13:48:26

Naixn
a ton avis c quoi la solution,
je sais que ma méthode est tres lourde sur le serveur, mais ca, est valable pour les gros fichiers.
par contre ,et pour les fichiers dont la tailles est inferieur à 1Mega, yaura po des probs.
tu peut nous proposer une methode nickel?surtt que té d'accord que
" la reconnaissance par l'extension n'a jamais été une bonne chose !"
amicalement.

signaler à un administrateur
Commentaire de TheSin le 26/12/2006 13:52:48

Naixn, c'est sûr que c'est toujours plus pratique de simplement avoir l'extenstion html que php pour le référencement, mais il me semble que ça ne change rien, si ?
A la rigueur, vous avez toujours l'URL Rewriting, mais bon, vu que c'est pas toi qui décide .... ;-)

La solution par l'extension me parait être une bonne chose, si on a pas le serveur configuré comme à la boite de Naixn :-P

signaler à un administrateur
Commentaire de Naixn le 26/12/2006 14:41:08

Trouver une solution universelle, je ne suis pas bien sûr qu'il y en ai une efficace...
Je sais qu'avec ma configuration apache, il me suffirait de parser le fichier :
/etc/apache2/mods-available/php5.conf
Dans lequel j'ai (entre autre) :
AddType application/x-httpd-php .php .phtml .php3 .html .htm .inc .selected .txt .xml
Ce qui permet de connaître quels sont les fichiers qui peuvent être des fichiers PHP.
Après, ça dépend de la conf PHP de chacun... Et en plus ça marche pas sur Windows =D

P.S.: Oui ! Je sais c'est over dégueulasse les fichiers .txt/.xml parsés par PHP. Mais c'est pas moi qui choisi :(

signaler à un administrateur
Commentaire de younes371 le 26/12/2006 14:45:15

la technique est tres lourde pour le serveur, mais elle est tres efficace,
mais reste à voir d'autres techniques plus simple,
par exemple la technique de verification d'extenstion :

<?php
//On fait un tableau contenant les extensions autorisées.
//Comme il s'agit d'un avatar pour l'exemple, on ne prend que
//des extensions d'images.
$extensions = array('.png', '.gif', '.jpg', '.jpeg');
// récupère la partie de la chaine à partir du dernier . pour
//connaître l'extension.
$extension = strrchr($_FILES['avatar']['name'], '.');
//Ensuite on teste
if(!in_array($extension, $extensions))
//Si l'extension n'est pas dans le tableau
{
     $erreur = 'Vous devez uploader un fichier de type png, gif, jpg, jpeg, txt ou doc...';
}
?>
//Cette méthode est une première approche qui nous suffit pour
//le moment mais, en réalité, il faudrait vérifier le type MIME
//des fichiers uploadés.

signaler à un administrateur
Commentaire de Naixn le 26/12/2006 15:25:42

Non, elle n'est pas du tout efficace !
Exemple, je créé un fichier qui s'appelle "exemple de fichier PHP.txt"
Avec le contenu suivant :

"
Pour faire un hello world en php, il faut faire :
==
<?php echo 'Hello World'; ?>
==
Voilà ! A la prochaine !
"

Eh bien mon fichier contient les extensions PHP, pourtant ça n'en est pas un :-/

Le problème avec le type MIME, c'est que pour un fichier PHP, ça donnerait :
text/plain
Or, c'est aussi le cas des fichier TXT, HTML, etc.
Donc ça ne serait pas du tout efficace non plus.

signaler à un administrateur
Commentaire de kankrelune le 26/12/2006 15:40:02

La méthode de Amezghal bien que lourde est la seule vraiment fiable... en effet il est très simple de contourner le filtrage par extension via une fausse extension ou via une attaque null byte... il est également possible de simuler une image en ajoutant le bon header dans le contenu du fichier... bref le seul moyen fiable c'est de parser le contenu... par contre la fonction si dessus doit être améliorée... .. .

<?php

function is_php($fichier)
{
    if(!is_file($fichier))
        return false;

    return (bool)preg_match('~<\?[^xml]~i',file_get_contents($fichier));
}

?>

@ tchaOo°

signaler à un administrateur
Commentaire de Naixn le 26/12/2006 15:45:09

Encore une fois, non !
Elle n'est pas fiable du tout !
Regarde bien mon exemple dans mon commentaire au dessus du tiens !

signaler à un administrateur
Commentaire de kankrelune le 26/12/2006 15:47:54

Et bien la fonction renverra true car <?php sera reconnu... moi je ne parse pas la première ligne mais tout le contenu... donc tu pourra mettre autant de text que tu veux ça reviendra au même... .. .

@ tchaOo°

signaler à un administrateur
Commentaire de Naixn le 26/12/2006 15:52:15

Eh bien, oui, ça sera reconnu en tant que fichier PHP, alors que ça n'en est pas un.

Certes tous les fichiers PHP seront reconnus, mais certains qui ne le sont pas le seront aussi.

Avoir un système qui fonctionne sur de faux-positifs ne peut pas, à mon goût, être qualifié de fiable...

signaler à un administrateur
Commentaire de kankrelune le 26/12/2006 15:57:13

Alors là je crois qu'on ne se comprend pas... l'interet de ce genre de fonction est d'empecher l'upload de tous les fichiers contenant du php pour éviter l'exploitation d'une faille include par exemple... car si on reprend l'exemple que tu donne précédament si le pirate réussis à l'inclure le fichier sera éxécuté quel que soit son extension... l'extension conditionne la façon dont le serveur traite le fichier mais concernant php ce n'est pas la même musique...

include('monfichier.txt');

le fichier sera éxécuté...

echo file_get_contents('monfichier.php');

le fichier ne sera pas éxécuté... mais je pense que je ne t'apprend rien... .. .

Donc le but ici est juste de tester la présence de code php... point... et cette fonction (ou plutot la version que je donne) le fait très bien... .. . ;o)

@ tchaOo°

signaler à un administrateur
Commentaire de amezghal le 26/12/2006 16:17:44

merci KANKRELUNE pour la version améliorée

Naixn, no comment.

-mais en peut encore améliorer la fonction

amicalelment


signaler à un administrateur
Commentaire de Naixn le 26/12/2006 16:38:42

Kankrelune : je crois que tu n'as pas lus les commentaires juste avant.
Les serveurs Apache, IIS, lighTTPD, etc. peuvent être configurés tels qu'ils fassent interpréter les fichiers HTML par PHP.

Cela dépend donc du serveur...

Sinon, si c'est pour tester la présence de code PHP, on est d'accord, ça teste bien, même si la façon de faire est vraiment horrible.
Après, si c'est pour vérifier la présence de code PHP QUI VA ÊTRE EXECUTÉ, alors là, non, je ne suis pas d'accord :)

signaler à un administrateur
Commentaire de amezghal le 26/12/2006 16:57:07

KANKRELUNE: pour ta version pourquoi tu met
if(!is_file($fichier))
        return false;

a mon avis cette vérif ce fait avant l'utilisation de la fonction,
car
true:ya du code php
false: ya po
!!

signaler à un administrateur
Commentaire de kankrelune le 26/12/2006 16:58:05

L'execution de code par php lors d'un include ne dépend pas du serveur donc ce n'est pas une question de configuration serveur... .. !

Par contre lorsque tu vas sur ce fichier en effet le serveur le traite en fonction de sa configuration... .. .

@ tchaOo°

ps : je ne dirais pas horrible... lourd sans ausun doute... mais si tu as une meilleur solution... .. ?

signaler à un administrateur
Commentaire de kankrelune le 26/12/2006 17:02:10

@ amezghal... si le fichier n'existe pas forcement il n'y a pas de code php dedans donc return false... quand à faire le test avant... non... d'une part la fonction doit être autonome donc si le fichier n'existe pas ça sert à rien qu'elle essaye de l'ouvrir (et ça évitera un warning)... d'autre part imaginons que tu utilise 20 fois cette fonction dans un script (peu de chance avec cette fonction mais imaginons) tu ne va pas faire 20 fois le test pour savoir si le fichier existe c'est à la fonction de le faire (en plus tu gagne de la place et c'est quand même un des but d'une fonction)... .. .

@ tchaOo°

signaler à un administrateur
Commentaire de Naixn le 26/12/2006 17:20:31

Bah j'ai bien proposé de parser le php.ini ( ou php5.conf pour moi ) pour connaître les extensions à risque... :)
Mais sur Windows, ou sur tout autre configuration apache ou le php.ini ne fait qu'un seul et même fichier, ça risque d'être lourd...

signaler à un administrateur
Commentaire de kankrelune le 26/12/2006 20:37:11

Ca change pas le problème puisque dans le cas d'un include toutes les extensions sont à risque... même les images... .. .

@ tchaOo°

signaler à un administrateur
Commentaire de webdeb le 26/12/2006 22:38:17

Il n'y a pas de solution fiable de toute façon !

signaler à un administrateur
Commentaire de kankrelune le 27/12/2006 16:11:51

Pour savoir si un fichier contient du php... si... le code si dessus... après concernant l'execution de fichier par le serveur effectivement c'est une autre histoire... .. .

@ tchaOo°

signaler à un administrateur
Commentaire de malalam le 28/12/2006 09:12:21 administrateur CS

Hello,

j'arrive après la guerre on dirait...mais j'ai passé un très bon Noël ;-)
Bon, j'interviens juste pour dire que ce code va rester, déjà.
Et pour donner mon avis : tel que je le vois ici, même si sa place serait plutôt dans les snippets (www.codyx.org, je le rappelle), il me plait bien. Certes, ça peut être lourd, mais c'est efficace.  Et dans le cadre d'un upload, il faut voir qu'il sera rare que l'on ait à utiliser cette fonction 20 fois d'affilée...ou sur un gros fichier.
Pour reprendre cet exemple :
"
Pour faire un hello world en php, il faut faire :
==
<?php echo 'Hello World'; ?>
==
Voilà ! A la prochaine !
"
perso, je ne laisserais pas un mec uploader ce genre de fichier sur mon serveur web...c'est la porte ouverte à toutes les fenêtres, comme dirait l'autre.
Quand bien même aurais-je la main sur mon serveur, d'ailleurs : question de principe ;-)

signaler à un administrateur
Commentaire de coucou747 le 28/12/2006 11:35:56

si par hazard, t'as une faille de include sur ton site, et que n'importe qui peut inclure un fichier qui est présent sur ton site :
include('path/'.$_GET['file']);
si ton upload accèpte un .png qui contient :
<?php
echo '<hr />'.$password_mysql.'<hr/>';
?>
ça peut être une très mauvaise chose...

salon moi, strpos devrait remplacer ce code, mais la méthode est la bonne

signaler à un administrateur
Commentaire de amezghal le 28/12/2006 13:40:47

une faille d'include ??
explique bien cette faille ça aide plus les autres(aussi moi ;p)


signaler à un administrateur
Commentaire de kankrelune le 28/12/2006 14:04:25

@ amezghal... fais une recherche c'est mainte fois traité... sur ce site comme ailleurs... d'ailleurs tu devrais savoir de quoi il sagit car ton code est principalement (voir uniquement) destiné à empecher l'upload de fichier visant ce type de faille... .. .

@ coucou747... oui sauf que, comme dit plus haut, strpos ne fera pas la différence entre <?, <?php et <?xml... le preg_match est donc préférable... ou alors il faut faire des multiple strpos et je suis pas sûr du gain en perf... .. . ;o)

@ tchaOo°

signaler à un administrateur
Commentaire de coucou747 le 28/12/2006 14:08:36

sur un gros fichiers, deux strpos, c'est mieux qu'un preg_match...

signaler à un administrateur
Commentaire de kankrelune le 28/12/2006 14:23:26

Peut être... à tester... mais ça risque d'être plus facilement contournable...

<?xml ?>
<?php echo 'dans l\'os';
<?xml ?>

ça risque de passer... .. .

@ tchaOo°

signaler à un administrateur
Commentaire de amezghal le 28/12/2006 15:00:35

$file=file_get_contents($fichier);
$pos=strpos($file,"<?");
if($i===false){
return true;
}else{
if(substr($file,$pos,3)=="xml")
return false;
else
return true;
}

signaler à un administrateur
Commentaire de malalam le 28/12/2006 15:10:48 administrateur CS

strpos s'arrête au premier motif trouvé. Donc là, hormis le fait que ton code est foireux -mais on a compris le principe-, si tu as d'abord <?xml suivi de <?php, t'es marron.

signaler à un administrateur
Commentaire de coucou747 le 28/12/2006 15:19:18

explode alors, mais ça aussi c'est gourmand...

signaler à un administrateur
Commentaire de kankrelune le 28/12/2006 15:19:31

Pareil pour strrpos()... mieux vaut un preg_match()... .. .

@ tchaOo°

signaler à un administrateur
Commentaire de malalam le 28/12/2006 15:23:35 administrateur CS

Suis de l'avis de Kankrelune, je pense que preg_match est la meilleure solution.

signaler à un administrateur
Commentaire de amezghal le 28/12/2006 16:12:56

suis avec preg_match,

signaler à un administrateur
Commentaire de aze555666 le 02/01/2007 01:16:38

@malamam "perso, je ne laisserais pas un mec uploader ce genre de fichier sur mon serveur web...". Eh bien heuresement que Nix n'a pas les mêmes principes :-)
Pour reprendre le débat, on peut peut-ête éviter de se battre en utilisant la fonction de kankrelune lorsqu'un script php du site utilise un include non fixe (je veux dire qui d'inclue pas toujours le même fichier c'est à dire include('&fichier') plutot que include'machin.txt')), et se contenter de vérifier les extensions "à risque" (ce qui dépend du serveur, mais il suffit alors à chacun de lister dans le code php les extensions interdites une bonne fois pour toutes, plutot que de parser le php.ini à chaque exécution) lorsque ce n'est pas le cas.

signaler à un administrateur
Commentaire de malalam le 02/01/2007 09:33:50 administrateur CS

@AZE => Nix uploade des fichiers ZIP...c'est très différent ;-)


signaler à un administrateur
Commentaire de coucou747 le 02/01/2007 12:51:32

nix a un serveur ASP... impossible d'y exécuter du php (enfin, php tourne sous IIS, mais je serais étonné que nix ai installé le programme...)

signaler à un administrateur
Commentaire de aze555666 le 02/01/2007 19:02:47

@malamam en effet, je n'y avais pas pensé :-)
@coucou747 il me semble qu'il y a un site asp sur codes sources, le probleme est donc entier. Heuresement donc que ce sont en fait des zip.

signaler à un administrateur
Commentaire de coucou747 le 03/01/2007 16:16:45

.... aze555666 ce code n'empèche pas d'uploader de fichiers asp...

signaler à un administrateur
Commentaire de aze555666 le 03/01/2007 22:59:39

Je sais. Je parlais du probleme de laisser ou non uploader des programmes sur le serveur.

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

pb de upload [ par filrouge13 ] Bonjour,Petit probl&#232;me de upload et de v&#233;rification de l'existence du fichier.J'ai r&#233;cup&#233;r&#233; ce code sur un forum, il devrait upload de fichier - interdire l'up de php. [ par pipouz ] bonjour a tous voila , jai un petit formulaire d'envoi de fichiers sur mon server apache , mais je voudrais pouvoir empecher l'upload de fichier PHP, Upload d'image ==> Problème :s [ par robapt ] Bonjour à tous!J'ai un petit problème pour uploader un fichier (une image) ! Enfin c'est plutôt que je ne vois pas comment il faut faire ! En fait, le upload ? [ par robapt ] Bonjours!Comment pourrai-ton uploader un fichier et en même temps mettre un petit commentaire?En gros moi je veux que le visiteur upload une image et Problème d'upload d'image [ par akiedispowa ] J'ai testé un script d'upload d'image que j'ai trouvé sur le web, mais je vais cracker ... J'ai deux images .jpg, l'une peut s'uploader et l'autre imp correction d'un script upload image [ par smed79 ] bonjour,j'ai besoin de votre aide pour  modifier et corriger un script upload image. j'ai un probleme avec le message d'erreur pour la taille maximum [PHP] upload de fichier par url [ par olvean ] bonjour voila je recherche un script qui upload un fichier a partir d'une url sur mon serveur merci d'avance upload d'un fichier sql et le mettre ds la base [ par ludovicanceaux ] Salut à tous, J'ai fais des recherches depuis cette aprem mais je ne trouve rien!!!!! je suis ss easyphp avec windows "vista évidemment pour arranger Upload - Mail puis supression [ par zarkwer ] Bonjour, voilà je suis entrain de réaliser un ptit formulaire simpliste où l'utilisateur tape divers renseignements puis transmet si il le veux un fic temps d'attente pour upload de fichier [ par lafouine1986 ] Bonjour à toutes et tous !Voilà après plusieurs rehcerches et de nombreux tests non concluants plus tard, je viens demander votre aide !J'ai réalisé u


Nos sponsors

Sondage...

CalendriCode

Janvier 2009
LMMJVSD
   1234
567891011
12131415161718
19202122232425
262728293031 

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,421 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.