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

PHP & Base de données Discussion :

Nettoyage $_POST [Sécurité]


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Juillet 2009
    Messages
    201
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 201
    Par défaut Nettoyage $_POST [Sécurité]
    Bonjour,

    Voici la fonction qui me permet de tester/nettoyer les données qui circule en POST...

    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
     
    function check_post($string) {
     
    	// Récupère une variable externe et la filtre
    	// Supprime les balises, et supprime ou encode les caractères spéciaux.
    	$string = filter_input(INPUT_POST, 'test', FILTER_SANITIZE_STRING); 
     
    	// Convertit tous les caractères éligibles en entités HTML
    	// Supprime les balises HTML et PHP d'une chaîne
    	$string = htmlentities(strip_tags($string));
     
    	// Protection contre les injections MYSQL
    	// Protège une commande SQL de la présence de caractères spéciaux
    	$string = mysql_real_escape_string($string);
    	// Ajoute des slash dans une chaîne si % et _ existe
    	$string = addcslashes($string, '%_');
     
    	return $string;
    }
    Quand pensez-vous ??

    Est-ce que j'ai oublié quelque chose, ou peut on encore sécuriser un peux plus les données $_POST ??

    Merci pour vos conseils et corrections

  2. #2
    Modérateur
    Avatar de Gugelhupf
    Homme Profil pro
    Analyste Programmeur
    Inscrit en
    Décembre 2011
    Messages
    1 326
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Analyste Programmeur

    Informations forums :
    Inscription : Décembre 2011
    Messages : 1 326
    Billets dans le blog
    12
    Par défaut
    Salut,

    En toute franchise, cela part d'une bonne idée pour protéger les données reçu par l'utilisateur... mais cela s'appelle tout simplement réinventer la roue (et pire encore dans la manière dont tu procèdes représente des pertes en perf, mais je vais te décrire ce qui ne va pas ).

    Dans un premier temps tu te sers de la fonction htmlentities(), tous les caractères pouvant être transformés en HTML le seront, alors que htmlspecialchars() te permet d'éviter les caractères éligibles représentants un danger (ce qui est mieux).

    Dans un deuxième temps, toujours avec la même fonction, tu t'apprêtes à stocker une chaine transformée, avec un poids plus élevé dans ta BDD, en faite tu te sers de cette fonction au mauvais moment, elle ne devrait pas se trouver dans ta fonction.

    mysql_real_escape_string() :
    quel horreur cette fonction, tu peux t'en passer si tu utilises mysqli ou PDO.

    addslashes() :

    Bon après je ne vais pas aller plus loin dans le raisonnement, parce que je pense que tu dois déjà bien comprendre ces différents points.
    N'hésitez pas à consulter la FAQ Java, lire les cours et tutoriels Java, et à poser vos questions sur les forums d'entraide Java

    Ma page Developpez | Mon profil Linkedin | Vous souhaitez me contacter ? Contacter Gokan EKINCI

  3. #3
    Membre confirmé
    Inscrit en
    Juillet 2009
    Messages
    201
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 201
    Par défaut
    Bon après je ne vais pas aller plus loin dans le raisonnement, parce que je pense que tu dois déjà bien comprendre ces différents points.
    En fait pas trop non


    mysql_real_escape_string() :
    Je vais passer sous une base SQLITE donc je vais maintenant utiliser sqlite_escape_string()Concernant le addslashes() :

    J'échappe le %, qui permet d'éviter d'avoir une injection MySQL; ainsi les injections du type "n'importe quelle chaine qui commence par t" (t%) sont ignorées

  4. #4
    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
    Faire une fonction générique de sécurisation est compliqué.
    Pour bien faire :

    1- Filtre tes données : vérifier que le type de données reçue correspond à ce que tu attends (is_int(), filter_input() ... )

    2- Insertion via requête préparée. Utilise PDO et pas les API vieillissantes. Utilise les requêtes préparées pour insérer les données pour te protéger des injections

    3- Protège l'utilisateur en sortie en filtrant l'affichage via htmlentities/htmlspecialchars.
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre confirmé
    Inscrit en
    Juillet 2009
    Messages
    201
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 201
    Par défaut
    Bonjour,

    As tu un exemple de script à me fournir pour le point 1 et le 3 stp ?

  6. #6
    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
    1

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $age = intval($_POST['age']
    $email = filter_input(INPUT_POST, 'email', FILTER_VALIDATE_EMAIL); // false email invalid , null email vide
     
    if($age && $email)
    {
       //insertion
    }
    3

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <div> Email : <?=htmlentities($email);?> </div>
    Pour faire simple dans ta base de données tu vas stocker des données brutes mais vérifiées et au moment de l'affichage tu les protège pour éviter les faille xss.
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

Discussions similaires

  1. Sécurité des variables _POST
    Par zeushaolin dans le forum Flash
    Réponses: 3
    Dernier message: 24/05/2010, 22h10
  2. La Sécurité dans Access
    Par Maxence HUBICHE dans le forum Sondages et Débats
    Réponses: 81
    Dernier message: 24/06/2007, 01h07
  3. [Sécurité] Nettoyage de données
    Par illimus dans le forum Langage
    Réponses: 14
    Dernier message: 16/06/2006, 08h27
  4. Pb de sécurité
    Par xtrips dans le forum Débuter
    Réponses: 6
    Dernier message: 16/04/2003, 07h50

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