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 :

Filtrage Post PHP - Sécurité


Sujet :

Langage PHP

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 37
    Points : 21
    Points
    21
    Par défaut Filtrage Post PHP - Sécurité
    Bonjour,

    Je développe une application en PHP faisant appel fortement à une BD.
    Mon problème est que je ne peux pas employer de Framework (ne me demandez pas pourquoi ) qui me faciliterait le coté "Sécurité" pour les injections XSS / SQL

    Exit les fonctions pg_escape_string ou htmlspecialchars_decode...
    Il faudrait donc que j'intègre une classe de filtrage des données POST.
    Après maintes recherches, je ne trouve pas la réponse à ma question:

    Quelles classes / scripts utiliser pour vérifier les données provenant de formulaires ?

    J'ai entendu parler des fonctions SANITIZE de PHP et de HTML Purifier. Que me conseilleriez vous ?

    Et que pensez vous de cette fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    function SecurePost($PostVar) {
    return addslashes(htmlspecialchars(mysql_escape_string(stripslashes(strip_tags($PostVar)))));
    }

  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
    Exit les fonctions pg_escape_string ou htmlspecialchars_decode...
    Je n'ai pas compris pourquoi

    Et que pensez vous de cette fonction
    Que c'est une bouillie qui mélange tout.
    - a quoi sert le stripslashes ?
    - mysql_escape_string a été remplacé par mysql_real_escape_string
    - si le but est de faire une insertion dans une base de données, le htmlspecialchars ne sert à rien.

  3. #3
    Membre émérite
    Avatar de Eric2a
    Homme Profil pro
    Technicien
    Inscrit en
    Septembre 2005
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Corse (Corse)

    Informations professionnelles :
    Activité : Technicien

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 225
    Points : 2 411
    Points
    2 411
    Par défaut
    Salut,

    +1 Sabotage.

    Prenons un exemple avec une donnée issue d'une requête HTTP POST.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $message=(isset($_POST['message']))?$_POST['message']:'';
    On commence par vérifier si les guillemets magiques sont activés.

    Qu'est-ce que les guillemets magiques?
    Lorsque cette directive est active, les guillemets simples ', les guillemets doubles ", les antislashs \ et les caractères nul NULL sont protégés automatiquement avec un antislash. C'est le même résultat que celui de la fonction addslashes().

    Avertissement : Cette fonctionnalité est OBSOLETE depuis PHP 5.3.0

    Source : les guillemets magiques
    Si c'est le cas, il nous incombe de supprimer les anti-slash en trop.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(@get_magic_quotes_gpc())$message = stripslashes($message);
    La présence du caractère @ permet de ne pas avoir de message d'avertissement pour les version de PHP 5.3.0 et supérieures.

    À ce stade, $message contient le texte tel qu'il a été saisi dans le formulaire.

    S'il le texte est destiné à être inséré dans une base de donnée, il faut protéger cette dernière à l'aide de mysql_real_escape_string().
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $message_SQL = mysql_real_escape_string($message);
    S'il le texte est destiné à être inséré dans une page HTML, il faut protéger cette dernière à l'aide de la fonction htmlspecialchars() ou de la fonction htmlentities().
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $message_HTML = htmlspecialchars($message,ENT_QUOTES);
    À voir également Le Filtrage des données.

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 37
    Points : 21
    Points
    21
    Par défaut
    Merci pour vos réponses.

    - Si je résume:
    Un "mysql_real_escape_string()" / "pg_escape_string()" à l'insertion dans une base de données.
    Un "htmlspecialchars()" à l'affichage des données provenant d'une BD.
    Ces deux fonctions déployées, elles contreraient les injections SQL et XSS.

    - En faisant des recherches sur le net, je constate des avis contradictoires, par exemple si je me réfère à http://techpad.co.uk/content.php?sid=86, ils recommandent d'utiliser une fonction similaire à la fonction "SecurePost" postée plus haut.

    - D'où mon idée d'utiliser les fonctions de filtrage de données "Sanitize" assez récentes de PHP.

  5. #5
    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
    Moi je trouve cela très discutable d'introduire du texte formaté html dans une base de donnée.
    Mais c'est sur que dans la vie courante, en dehors de la perte d'espace, ça ne sera jamais un problème.

    Par contre la combinaison des 3 trim, la je ne vois pas du tout.

  6. #6
    Membre émérite
    Avatar de Eric2a
    Homme Profil pro
    Technicien
    Inscrit en
    Septembre 2005
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Corse (Corse)

    Informations professionnelles :
    Activité : Technicien

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 225
    Points : 2 411
    Points
    2 411
    Par défaut
    Citation Envoyé par geekforever
    Ces deux fonctions déployées, elles contreraient les injections SQL et XSS
    Oui mais séparemment.
    Citation Envoyé par geekforever
    Un "mysql_real_escape_string()" / "pg_escape_string()" à l'insertion dans une base de données.
    Ces fonctions suffisent à contrer les injections SQL.

    Citation Envoyé par geekforever
    Un "htmlspecialchars()" à l'affichage des données provenant d'une BD.
    Oui mais attention... quelque soit la provenance des données (formulaire, fichier, BDD, ...).

    La fonction sanitize() ci-dessous permet la convertion en fonction du paramètre $html :
    $html = false
    On empêche les injections SQL dans la base de données

    $html = true
    On empêche les codes malveillants d'être interprétés dans la page HTML
    Un contenu balisé étant "inoffensif" après l'appel à la fonction htmlspecialchars, il est préférable de rendre sa suppression facultative.
    Le paramètre $strip à true nous permet de supprimer ces balises.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    function sanitize($str,$strip=false,$html=false){
    	$s=trim($str);
    	if($strip)$s=strip_tags($s);
    	return ($html)?htmlspecialchars($s):mysql_real_escape_string($s);
    }
     
    $str = sanitize($texte,false,false); // On se protège des injections SQL
     
    $str = sanitize($texte,false,true); // On se protège des attaques XSS
    Edit : Correction d'une faute de saisie dans le code.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 37
    Points : 21
    Points
    21
    Par défaut
    OK merci à tous.

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 37
    Points : 21
    Points
    21
    Par défaut
    Voici ce que j'utilise au final, avant de faire tout traitement sur des valeurs Post

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    foreach ($_POST as $key => $value) {
     	   if ( !is_numeric($value) ) {
    		$_POST[$key] = addcslashes(pg_escape_string($value), '%_');
    	}
    }
    sous oublier un htmlentities pour l'affichage...

Discussions similaires

  1. Recup variables méth. POST + Php non affiché
    Par brutalus dans le forum Langage
    Réponses: 11
    Dernier message: 10/09/2010, 19h24
  2. [httplib] Problème formulaire post PHP
    Par Gamoth dans le forum Réseau/Web
    Réponses: 4
    Dernier message: 27/03/2010, 14h40
  3. [PHP-JS] pb post php
    Par richton95 dans le forum Langage
    Réponses: 6
    Dernier message: 31/01/2006, 00h42
  4. [Sécurité] [PHP] Sécurité
    Par diaboloche dans le forum Langage
    Réponses: 5
    Dernier message: 11/10/2005, 09h42

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