IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Sécurite Upload fichier via FTP ou via move_uploaded_file


Sujet :

Langage PHP

  1. #1
    Membre régulier
    Homme Profil pro
    Inscrit en
    Février 2012
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2012
    Messages : 81
    Points : 89
    Points
    89
    Par défaut Sécurite Upload fichier via FTP ou via move_uploaded_file
    Bonsoir a tous,

    Voila il ne s'agit pas a proprement parlé d'un problème mais plutôt d'une réflexion sur la sécurité en général des sites web utilisant la possibilité d'upload de fichier via des formulaires.

    Je me demande en effet pourquoi dans 90% des cas les développeurs passent par la fonction php move_uploaded_file qui crée a mon sens une grosse faille sécuritaire dans la site plutôt que de passer par les fonction ftp de php.

    En effet dans la majorité des cas que j'ai pu analyser, le développeur met le dossier upload en "777" puis utilise la fonction move_uploaded_file pour gérer l'upload des fichiers.

    A ce niveau je trouve franchement la méthode pour le moins très peu sure, en effet il suffit ensuite que certaines scripts ou pages soient sensibles a une attaque d'injection de code ou autre et résultat les pirates ont un joli dossier ou ils peuvent stocker tout ce qu'ils veulent pour s'autoriser pas mal de dégâts dans le site.

    Alors que s'ils passaient par les fonctions FTP, il n'y aurait plus besoin de mettre des dossier en "777" et dans ce cas la les sites seraient a mon avis un peu plus sécurisé a ce niveau du moins.

    Cependant j'aimerais bien avoir vos avis pour voir si j'oublies quelques chose dans ma déduction ou si c'est simplement par simplicité que se genre de pratique se fait encore très régulièrement.

    De plus ce problème est aussi bien présent si php fonctionne en mode "module php" ou en CGI, voir je dirais pire pour le mode CGI qui est en principe utilisé pour faire tourner php avec l'utilisateur propriétaire des pages php ce qui rend le site encore plus sensible a tout problème d'injection de code.
    Alors qu'a priori en fonctionnant en module php, le php est exécuter avec l'utilisateur exécutant le serveur web, utilisateur qui en principe a très peu de droit et n'a justement aucun droit d'écriture sur les fichiers php du site.

    J'espère que cette réflexion vous passionnera ou qu'a défaut si je fais fausse route certains pourront m'expliquer pourquoi et comment.

    Vous souhaitant un bon week-end a tous et merci d'avance de vos réponses.

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Je ne vois pas bien ou tu veux en venir : tu ne peux pas coupler FTP et un formulaire HTML.

  3. #3
    Membre régulier
    Homme Profil pro
    Inscrit en
    Février 2012
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2012
    Messages : 81
    Points : 89
    Points
    89
    Par défaut
    Si si justement.

    On peut faire l'upload des fichiers d'un formulaire via ftp.

    Voici la doc de php:
    http://php.net/manual/fr/book.ftp.php

    Voici dans l'idée deux façons de faire pour un résultat identique
    Via les fonctions ftp de php (c'est un exemple)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
    $paths=$_POST['pathserver'];
    $filep=$_FILES['userfile']['tmp_name'];
    $ftp_server=$_POST['server'];
    $ftp_user_name=$_POST['user'];
    $ftp_user_pass=$_POST['password'];
    $name=$_FILES['userfile']['name'];
     
    // set up a connection to ftp server
    $conn_id = ftp_connect($ftp_server);
     
    // login with username and password
    $login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass);
     
    // check connection and login result
    if ((!$conn_id) || (!$login_result)) {
           echo "FTP connection has encountered an error!";
           echo "Attempted to connect to $ftp_server for user $ftp_user_name....";
           exit;
       } else {
           echo "Connected to $ftp_server, for user $ftp_user_name".".....";
       }
     
    // upload the file to the path specified
    $upload = ftp_put($conn_id, $paths.'/'.$name, $filep, FTP_BINARY);
     
    // check the upload status
    if (!$upload) {
           echo "FTP upload has encountered an error!";
       } else {
           echo "Uploaded file with name $name to $ftp_server ";
       }
     
    // close the FTP connection
    ftp_close($conn_id);
    Version avec move_uploaded_file:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     
    $uploads_dir = '/uploads';
    foreach ($_FILES["pictures"]["error"] as $key => $error) {
        if ($error == UPLOAD_ERR_OK) {
            $tmp_name = $_FILES["pictures"]["tmp_name"][$key];
            $name = $_FILES["pictures"]["name"][$key];
            move_uploaded_file($tmp_name, "$uploads_dir/$name");
        }
    }
    certes la méthode via ftp est un peu plus longue a codé et encore mais pour moi il n'y a pas photo en terme de sécurité par rapport a la méthode via move_uploded_file.

  4. #4
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Je ne comprends vraiment pas ou tu veux en venir.
    d'ou viennent ces valeurs ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $paths=$_POST['pathserver'];
    $ftp_server=$_POST['server'];
    $ftp_user_name=$_POST['user'];
    $ftp_user_pass=$_POST['password'];

  5. #5
    Membre régulier
    Homme Profil pro
    Inscrit en
    Février 2012
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2012
    Messages : 81
    Points : 89
    Points
    89
    Par défaut
    alors pour faire simple je veux en venir aux différentes méthodes qu'il y a de coder l'upload de fichier via un formulaire avec des façons plus ou moins sécurisé au niveau de leur conception.

    Peu importe d'où proviennent les valeurs que tu quotes, elles peuvent être transmises avec le formulaire, stockées en base de donnée ou dans un fichier de variable.

    Le nœud de la réflexion est sur la partie upload a savoir la suite du code pas savoir d'où provienne les valeurs de connexion et le path du répertoire de stockage.

  6. #6
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 199
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 199
    Points : 8 424
    Points
    8 424
    Billets dans le blog
    17
    Par défaut
    Si si justement.

    On peut faire l'upload des fichiers d'un formulaire via ftp.
    Mais là il faut que le client ait un serveur FTP.

  7. #7
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Peu importe d'où proviennent les valeurs que tu quotes, elles peuvent être transmises avec le formulaire
    si on parle de sécurité et qu'on transmet les logins du serveur dans le formulaire, ça me parrait compromis.

    Le nœud de la réflexion est sur la partie upload
    L'upload tu le fais visiblement de la manière usuelle.
    Si j'ai bien compris, tu utilises le serveur FTP pour déplacer le fichier du dossier temporaire du serveur web vers un autre dossier.
    Je ne vois donc pas la différence avec move_uploaded_file()

  8. #8
    Membre régulier
    Homme Profil pro
    Inscrit en
    Février 2012
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2012
    Messages : 81
    Points : 89
    Points
    89
    Par défaut
    Bonjour,

    c'est bien la tout le nœud du problème, via mouve_uploaded_file, tu es obligé de donner les droits en écriture sur le répertoire d'upload a l'utilisateur sous lequel php tourne.

    Or si php a les droits en écriture sur le répertoire le site est sensible a tout attaque passant par le détournement de script php puisque php aura le droit complet sur le ou les dossiers.

    Alors qu'avec la méthode par le FTP, le piratage doit être beaucoup plus complexe que juste le détournement de scripts PHP puisque seul l'utilisateur FTP dispose des droits en écriture et qu'en principe PHP ne tourne pas sous cette utilisateur.

    Ce qui fait que malgré des failles dans les scripts, PHP ne pourra pas écrire dans les répertoires puisque n'ayant aucune autorisation d'écriture.
    En terme de sécurité cela me parait bien plus sécurisé comme méthode.

    Bien sur la on rentre dans un aspect qui a très peu voir jamais été abordé par les développeurs voir inconnus pour certains, mais je pense que des forums comme ceux de développez.com sont justement la pour aussi aborder ce genre de sujet beaucoup plus pointus que l'écriture de script standards.

    De formation en administration de système, je suis toujours très étonné lorsque un développeur web demande de mettre un répertoire voir plusieurs arborescences complètes en "777" sur un site web alors que cela est contraire à toutes les règles de sécurité, pour juste faire de l'upload de fichier via la partie backend de son site.

    Après la faute repose aussi essentiellement sur les CMS qui utilise largement la solution du move_uploaded_file par facilité surement, mais ils sont un peu plus malin dans leur raisonnement puisque pour les plus sérieux, il demande ensuite de mettre un fichier .htaccess interdisant la navigation dans le répertoire voulu mais malheureusement dans la pratique peut de gens le mette en place créant ainsi des failles énormes.


    Afin je le répètes c'est surtout uen réflexion sur la pratique de programmation, donc tous les avis sont bons et j'aimerais bien connaitre les raisons qui poussent les développeurs a choisir l'une ou l'autre méthode qui sont totalement IDENTIQUES dans le résultat.

  9. #9
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    La faille énorme c'est si le script d'upload permet l'introduction d'un fichier PHP et il n'a pas besoin de droits d'écriture.
    Après, comme tu le dis, tu peux mettre l'arborescence en lecture seule sauf le repertoire de destination de l'upload.

  10. #10
    Membre régulier
    Homme Profil pro
    Inscrit en
    Février 2012
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2012
    Messages : 81
    Points : 89
    Points
    89
    Par défaut
    A priori nous ne sommes pas sur la même optique du problème.

    D'ailleurs j'aurais bien voulu l'avis d'autres développeurs pour faire une vraie réflexion sur le sujet plutôt qu'un dialogue comme nous le faisons certes instructif mais qui ne tourne pas sur le sujet de fond à savoir la sécurité du site web.


    le but de cette réflexion est de justement voir le danger même d'un seul répertoire en écriture, car il ne faut pas penser que seul le script d'upload peut être attaqué mais sur un site de plusieurs dizaines voir centaines de page PHP, personne ne peut être sûr à 100% d'avoir fait un code sans faille et c'est tout la le problème d'avoir ensuite des dossiers en écriture pour le compte faisant tourner php.

Discussions similaires

  1. Winsocks : Upload fichier sur ftp via proxy
    Par evuillet dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 10/08/2015, 03h50
  2. Envoi d'un fichier par le client via FTP
    Par Nihilivin dans le forum Débuter
    Réponses: 4
    Dernier message: 28/08/2014, 19h54
  3. [PHP 5.3] upload fichier sur ftp via php
    Par victoires dans le forum Langage
    Réponses: 1
    Dernier message: 11/10/2011, 14h49
  4. Modifier fichiers d'un autre via FTP
    Par Rian83 dans le forum Réseau
    Réponses: 3
    Dernier message: 07/02/2010, 04h44
  5. [Upload] upload fichier sur ftp free
    Par Halukard dans le forum Langage
    Réponses: 61
    Dernier message: 12/02/2006, 20h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo