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 :

Quelle est la meilleure pratique pour empêcher l'injection de codes viraux [PHP 5.3]


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    316
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2010
    Messages : 316
    Par défaut Quelle est la meilleure pratique pour empêcher l'injection de codes viraux
    Bonjour,

    J'ai un formulaire en PHP... Je vais le sécuriser maximum.
    Pour empêcher les injections de code malicieux, j'utilise htmlspecialchars : ainsi, les informations remplies dans les champs par les utilisateurs qui contiennent de balises HTML seront sans code HTML actif.
    Est-ce que c'est suffisant ? Sinon que je dois faire d'autres ?

    Merci et bonne journée
    Bonne année

  2. #2
    Expert confirmé
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Par défaut
    Sécurise les insertions en base avec htmlspecialchar ou strip_tags et mysql_real_escape_string ou les requêtes préparées.
    Sécurise la récupération d'informations avec les filtres http://php.net/manual/fr/book.filter.php
    Sécurise la sortie d'information avec les filtres également.

  3. #3
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 693
    Par défaut
    Je pense que c'est plus une question de philosophie mais je suis plus pour échapper les données à l'affichage et pas à l'insertion.
    A l'insertion je filtre et protège des injections.

    C'est un peu plus gourmand en ressource car on échappe les données pour chaque utilisateur au lieu de le faire une fois à l'insertion, mais du coup c'est une protection "active" qui va échapper même des données ne venant pas de la bdd.

    Certain moteur de template ont d'ailleurs par défaut un échappement des données activé.

    Il faut également te protéger de ce que l'on appelle les failles CSRF (cross site request forgery ) qui consiste à venir attaquer une partie du site (un formualire dans ton cas) avec un autre site. Voici : http://fr.wikipedia.org/wiki/Cross-site_request_forgery pour plus de détail
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    316
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2010
    Messages : 316
    Par défaut
    Bonjour,

    Je pense que j'ai terminé ainsi l"étape 1
    Une fois que mon formulaire est sécurisé comme ci-dessus, il faut utiliser un certificat de SSL...
    Après il faut aussi protéger contre les attaques les failles CSRF... en utilisant un jeton/token...


    Citation Envoyé par grunk Voir le message
    (...)
    Il faut également te protéger de ce que l'on appelle les failles CSRF (cross site request forgery ) qui consiste à venir attaquer une partie du site (un formualire dans ton cas) avec un autre site. Voici : http://fr.wikipedia.org/wiki/Cross-site_request_forgery pour plus de détail
    Par contre, dans mon cas, je me demande si je peux utiliser un jeton puisqu'il s'agit d'un formulaire simple : l'utilisateur arrive au formulaire sans ouvrir une session (donc, l'utilisateur a l'accès au formulaire sans mot de passe)...

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    316
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2010
    Messages : 316
    Par défaut
    Citation Envoyé par aspkiddy Voir le message
    Bonjour,

    Je pense que j'ai terminé ainsi l"étape 1
    Une fois que mon formulaire est sécurisé comme ci-dessus, il faut utiliser un certificat de SSL...
    Après il faut aussi protéger contre les attaques les failles CSRF... en utilisant un jeton/token...
    Par contre, dans mon cas, je me demande si je peux utiliser un jeton puisqu'il s'agit d'un formulaire simple : l'utilisateur arrive au formulaire sans ouvrir une session (donc, l'utilisateur a l'accès au formulaire sans mot de passe)...
    Puisque personne ne répond alors je vais fermer cette discussion et je vais ouvrir un outre sur "jeton/token"

    Merci pour vos participations... c'était très utile pour moi

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    316
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2010
    Messages : 316
    Par défaut
    Bonjour Benjamin Delespierre, amoiraud, RunCodePhp et grunk,

    Je vais appliquer vos conseils étape par étape dans un formulaire fictif...
    Alors, voici la 1re serrure (1re étape) avec htmlspecialchars :

    Citation Envoyé par Benjamin Delespierre Voir le message
    Sécurise les insertions en base avec htmlspecialchar ou strip_tags et mysql_real_escape_string ou les requêtes préparées.
    Sécurise la récupération d'informations avec les filtres http://php.net/manual/fr/book.filter.php
    Sécurise la sortie d'information avec les filtres également.
    dans mon formulaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <form method="post" action="engregistrement.php">
    <input name="prenom" type="text" id="prenom" />
    </form>
    dans mon 2e fichier (engregistrement.php)
    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
    <?php
    include"bd_db/connec.php";
    include"select.php";
     
    $prenom=$_POST["prenom"];
     
    //  Pour traiter les accents et suprimer les code html :
     
    $prenom= htmlspecialchars($prenom, ENT_QUOTES);
     
     
    $query = "INSERT INTO $table_db (colone_prenom)";
    $query .= "VALUES (''$prenom')";
     
    $result = mysql_query($var_query, $cnx) or die (mysql_error());
     
    ?>
    L'utilisateur entre, par exemple [<strong>toto] comme prénom
    alors avec le code ci-dessus, j'obtiens l'enregistrement dans mon bd*: [&lt;strong&gt;toto]
    et je peux visionner cet enregistrement dans un autre fichier PPP (dans le code ci-dessous) comme cela*: (dans le code source : [&lt;strong&gt;toto] et l'affichage (interprétation de navigateur) : [<strong>toto]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <?php
    include"bd_db/connec.php";
    include"select.php";
     
    $req=  " select colone_prenom FROM $table_db  ";
    $rep =  mysql_query($req, $cnx) or die( mysql_error() ) ;
    while($row=mysql_fetch_row($rep)){
    $prenom_engregistre=$row[0];
    echo "$prenom_engregistre" ;
    echo "\n";
    echo " ; ";}
    ?>
    Est-ce que cette procédure est correcte avec htmlspecialchars AU PREMIERE ÉTAPE?
    Est-ce que cette procédure par htmlspecialchars est suffisante au niveau de sécurité AU PREMIERE ÉTAPE?

  7. #7
    Expert confirmé
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Par défaut
    Mes commentaire dans le code:
    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
    <?php
    // bd db ? généralement fait /config/db/connection.php mais bon
    include "bd_db/connec.php";
     
    // kézako ?
    include "select.php";
     
    // Utiliser filter_input à la place
    $prenom=$_POST["prenom"];
     
    // strip_slashes + strip_tags + mysql_real_escape_string c'est mieux
    $prenom= htmlspecialchars($prenom, ENT_QUOTES);
     
    // Aucune sécurité contre les injections
    $query = "INSERT INTO $table_db (colone_prenom)";
    $query .= "VALUES (''$prenom')";
     
    // or die en DEV mais JAMAIS EN PROD et surtout pas avec l'erreur MySQL retournée 
    $result = mysql_query($var_query, $cnx) or die (mysql_error());
    Est-ce que cette procédure est correcte avec htmlspecialchars AU PREMIERE ÉTAPE?
    Est-ce que cette procédure par htmlspecialchars est suffisante au niveau de sécurité AU PREMIERE ÉTAPE?
    Elle est correcte en ce sens qu'elle fait son job, en revanche, elle est clairement insécurisée.

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    316
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2010
    Messages : 316
    Par défaut
    Bonjour Benjamin,

    Super merci pour tes commentaire...
    Citation Envoyé par Benjamin Delespierre Voir le message
    Mes commentaire dans le code....)
    (...) en revanche, elle est clairement insécurisée.
    voila je suis au 2e étape :
    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
    <?php
    //connection au serveur
    include"/config/db/connection.php";
    	//sélection de la base de données et table
    include"/config/db/selection.php";
     
    // Utiliser filter_input à la place
    								//$prenom=$_POST["prenom"];
    $prenom = filter_input(INPUT_POST, 'prenom', FILTER_SANITIZE_STRING); //// voir les filtres http://www.php.net/manual/fr/filter.filters.php [Filtres de nettoyage]
     
    // strip_slashes + strip_tags + mysql_real_escape_string c'est mieux
    								//$prenom= htmlspecialchars($prenom, ENT_QUOTES);//  Pour traiter les accents et suprimer les code html :
    $prenom= stripslashes($prenom); //Supprime les antislashs d'une chaîne et aussi les balises (exemple <strong>)
    $prenom = strip_tags($prenom); // Supprime les balises (code)
     
    $prenom = mysql_real_escape_string($prenom); //évite les injections SQL en protègeant les caractères spéciaux d'une commande SQL
     
    $query = "INSERT INTO $table_db (colone_prenom)";
    $query .= "VALUES ('$prenom')";
     
    $result = mysql_query($query, $cnx) or die (mysql_error());
     
    ?>
    Est-ce que cette procédure est correcte et suffisante AU 2. ÉTAPE?

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    316
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2010
    Messages : 316
    Par défaut
    Je ne comprends plus stealth35

    Voici mon code d'enregistrement de donnés dans la BDD que j'ai fait selon vos (toi et les autres experts) commentaires... Est ce que ce n'est pas correct ?

    Citation Envoyé par aspkiddy Voir le message
    Bonjour Benjamin,

    Super merci pour tes commentaire...


    voila je suis au 2e étape :
    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
    <?php
    //connection au serveur
    include"/config/db/connection.php";
    	//sélection de la base de données et table
    include"/config/db/selection.php";
     
    // Utiliser filter_input à la place
    								//$prenom=$_POST["prenom"];
    $prenom = filter_input(INPUT_POST, 'prenom', FILTER_SANITIZE_STRING); //// voir les filtres http://www.php.net/manual/fr/filter.filters.php [Filtres de nettoyage]
     
    // strip_slashes + strip_tags + mysql_real_escape_string c'est mieux
    								//$prenom= htmlspecialchars($prenom, ENT_QUOTES);//  Pour traiter les accents et suprimer les code html :
    $prenom= stripslashes($prenom); //Supprime les antislashs d'une chaîne et aussi les balises (exemple <strong>)
    $prenom = strip_tags($prenom); // Supprime les balises (code)
     
    $prenom = mysql_real_escape_string($prenom); //évite les injections SQL en protègeant les caractères spéciaux d'une commande SQL
     
    $query = "INSERT INTO $table_db (colone_prenom)";
    $query .= "VALUES ('$prenom')";
     
    $result = mysql_query($query, $cnx) or die (mysql_error());
     
    ?>
    Est-ce que cette procédure est correcte et suffisante AU 2. ÉTAPE?
    Il ne faut pas faire de stripslashes ? ni de strip_tags ? ni filter_input ?

  10. #10
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    Bonsoir,

    Citation Envoyé par Benjamin Delespierre Voir le message
    Sécurise les insertions en base avec htmlspecialchar ou strip_tags et mysql_real_escape_string ou les requêtes préparées.
    Citation Envoyé par grunk Voir le message
    Je pense que c'est plus une question de philosophie mais je suis plus pour échapper les données à l'affichage et pas à l'insertion.
    A l'insertion je filtre et protège des injections.
    Je pencherai très clairement du côté de grunk. Pour la bonne raison que les données peuvent très bien être exploitées par d'autres programmes totalement étrangers au monde web et/ou PHP. J'ai eu une très mauvaise expérience sur un développement avec des données qui avaient été échappées ainsi à l'insertion (tout avait été échappé avec htmlentities()). Je déconseille donc fortement de mélanger de la présentation avec des données brutes. Une donnée brute doit rester brute, après c'est au développeur de bien saisir le sens qu'elle prendra dans un environnement donné et c'est encore à lui de s'en prémunir si nécessaire. Comme disait ma grand-mère, il n'est jamais bon de mélanger des torchons et des serviettes. Merci mémé...

  11. #11
    Expert confirmé

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 418
    Par défaut
    Attention quand même de n'utiliser strip_tags qu'en connaissance de cause car cela limite les possibilités d'expression dans le formulaire (on ne pourra pas par exemple donner des exemples de code html ou php puisque les balises seront supprimées).

    Comme grunk je déconseille l'utilisation de htmlspecialchars pour l'enregistrement en Bdd car sans parler de philosophie il y a des inconvénients pratiques : alourdi les tables avec des caractères inutiles et rend les données moins propres en cas d'exportation des tables sans traitement complémentaire.
    Ces inconvénients sont relativement limités avec htmlspecialchars. Le pire serait d'utiliser htmlentities car en plus d'accroitre considérablement les inconvénients ci-dessus, cela rendrait impossible des recherches insensibles aux caractères accentués (je veux dire qu'une recherche sur 'a' ne pourrait jamais trouver 'à').

    Je réserve donc pour ma part ces fonctions uniquement pour l'affichage.

    EDIT : A bah tiens, le temps de poster je vois que rawsrc a déjà développé à peu près les mêmes arguments

  12. #12
    Expert confirmé
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Par défaut
    Gaffe quand même, on a vite fait d'oublier d’échapper les données en sortie, c'est pour ça que je les nettoies toujours en entrée.

  13. #13
    Membre émérite
    Avatar de amoiraud
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2006
    Messages
    606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2006
    Messages : 606
    Par défaut
    Salut,

    Tu peut également utiliser mysql_real_escape_string pour éviter les injections SQL

  14. #14
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut
    Salut

    Tout dépend du degré que tu souhaite obtenir, mais comme tu parles de "maximum", ne pas oublier le SSL (https).

    Faire en sorte de générer un contenu HTML sécurisé c'est une chose, mais sans SSL les données transiteront "en clairs", donc elles peuvent toujours être interceptées voire modifiées en cours de route.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Quelle est la meilleure solution pour créer des Web Services?
    Par Flipmode dans le forum Services Web
    Réponses: 1
    Dernier message: 26/04/2007, 15h12
  2. Quelle est la meilleur dsitrib. pour le wifi?
    Par jff_caen32 dans le forum Distributions
    Réponses: 1
    Dernier message: 23/03/2007, 12h21
  3. Réponses: 2
    Dernier message: 05/02/2007, 08h51
  4. Réponses: 5
    Dernier message: 17/08/2006, 10h10
  5. Réponses: 20
    Dernier message: 27/06/2006, 17h42

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