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 :

Requete PDO sécurisée ?


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Février 2012
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 257
    Par défaut Requete PDO sécurisée ?
    Bonjour,

    Généralement, je fais cela pour insérer dans une Bd
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      $req = $bdd->prepare('INSERT INTO table SET nom=:nom');
      $req->execute(array('nom' => $_POST['nom']));
    Aussi, je me suis amusé à envoyer cela dans un champ du formulaire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <script type="text/javascript">alert('Boum');</script>
    Et bien cela fait bien Boum.
    Sauf si on fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    strip_tags($_POST['nom'])
    Je pensais qu'une requête de cette sorte filtrait le code avant de l'envoyer dans la Bd.
    A moins que ce ne soit pas du tout ce type de requête qui s'appelle 'PDO'.

    Merci pour vos éclairages.

  2. #2
    Membre éprouvé Avatar de jisig
    Homme Profil pro
    null
    Inscrit en
    Avril 2014
    Messages
    146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Indonésie

    Informations professionnelles :
    Activité : null

    Informations forums :
    Inscription : Avril 2014
    Messages : 146
    Par défaut
    Tu te dois de sécuriser tes chaînes de caractères venant des utilisateurs manuellement (sauf avec un framework/librairies qui gère ça pour toi).

    un peu d'aide ici : https://secure.php.net/manual/fr/pdo.prepare.php

  3. #3
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Février 2012
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 257
    Par défaut
    Merci jisig,
    Les docs du zéro, sont toujours aussi bien.

    Et est-ce que des strip_tags(); sur les POST
    peuvent faire l'affaire ?
    Ca fonctionne pour
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <script type="text/javascript">alert('Boum');</script>

  4. #4
    Membre éprouvé Avatar de jisig
    Homme Profil pro
    null
    Inscrit en
    Avril 2014
    Messages
    146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Indonésie

    Informations professionnelles :
    Activité : null

    Informations forums :
    Inscription : Avril 2014
    Messages : 146
    Par défaut
    https://secure.php.net/manual/fr/fun...strip-tags.php

    c'est une fonction qui a pour but de supprimer certains tags, mais pas de sécuriser une chaîne, je pense qu'il sera mieux de lire un tutoriel et/ou doc à ce sujet.

    edit : voir aussi

  5. #5
    Membre Expert
    Avatar de Dendrite
    Femme Profil pro
    Développeuse informatique
    Inscrit en
    Juin 2008
    Messages
    2 129
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 59
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeuse informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2008
    Messages : 2 129
    Billets dans le blog
    8
    Par défaut
    Bonjour FeelWatt...

    Je me demande si ton problème ne vient pas plutôt du fait que tu ne fais pas tes requêtes préparées de la bonne façon... Voir manuel :
    http://php.net/manual/fr/pdo.prepare.php

    Tu fais un mix entre les requêtes préparées avec marqueurs anonymes et avec marqueurs nommés :

    1) marqueurs anonymes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     $req = $bdd->prepare('INSERT INTO table SET nom=?');
      $req->execute(array($_POST['nom']));
    OU
    2) marqueurs nommés
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     $req = $bdd->prepare('INSERT INTO table SET nom=:nom');
      $req->execute(array(':nom'=>$_POST['nom']));
    Ca, c'est pour l'insertion en base. Si tu veux bien vérifier que ton expérience de code nuisible tombe à l'eau avec les bonnes syntaxes de requête préparée, je n'ai pas le temps là.
    Question aux cracks : faut-il s'interdire de placer directement des $_POST comme il fait, et passer par des variables intermédiaires du genre $toto=$_POST['toto'];, ou bien ça n'est plus un problème avec les requêtes préparées ?

    Par ailleurs, quand ensuite, tu réutiliseras tout ce que tu prends de ta base pour des affichages, tu seras bon pour appliquer la fonction htmlspecialchars pour éviter des déconvenues avec des apostrophes ou autres caractères enquiquinants qui feraient bugger ton HTML.
    http://php.net/manual/fr/function.htmlspecialchars.php

    3) récupération des données en lecture
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    $data=array();
    while ($row = $sth->fetch(PDO::FETCH_ASSOC)){
       $data[]=$row;
    }
    $keys=array_keys($data[0]);
    $i=0;
    do{
       foreach($keys as $key){
          $data[$i][$key]=htmlspecialchars($data[$i][$key]);
       }
       $i++;
    }while($i<count($data));
    En général, c'est là que je me prends une volée de bois vert par des cracks (coucou Jreaux, coucou rawSrc), et ça me vexe un peu... mais ça me remets les idées en place sur les bonnes pratiques, ce qui est le but recherché après tout ! Pas taper, pas taper !
    PDO, une soupe et au lit !
    Partir de la fin est un bon moyen de retrouver son chemin. Bibi - 2020

  6. #6
    Invité
    Invité(e)
    Par défaut
    Hello Dendrite,
    On parle de moi ?

    Pour reprendre le 1er post : on a 2 choses indépendantes.

    1- Une requête préparée a pour vocation de sécuriser la requête SQL et de la protéger des "injections SQL" *.
    POINT.

    * On peut aussi utiliser bindValue ou bindParam, qui prennent un paramètre définissant s'il s'agit d'un entier (PDO::PARAM_INT), une chaîne (PDO::PARAM_STR),...
    Ce qui augmente un peu le niveau de sécurité.

    2- le fait qu'il y ait un <script> dans le champ n'a RIEN A VOIR avec une quelconque "injection SQL" !
    La preuve : rien n'empêche d'enregistrer du code HTML (donc des balises HTML) dans une table de bdd (via un textarea généralement)

    DONC, il faut sécuriser aussi les champs de formulaire, CONTRE les "codes HTML malveillants" :

    Au minimum.

    ** Il existe aussi des fonctions PHP de validation d'email, d'URL,... : voir filter_validate(),... Filtres de validation
    Dernière modification par Invité ; 21/12/2018 à 11h08.

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

Discussions similaires

  1. [PDO] Les requete PDO ne prennent pas en compte la premier ligne de résultat
    Par -Fly- dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 28/03/2012, 21h59
  2. [PDO] resultat requete PDO sous forme de tableau
    Par kate59 dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 11/08/2011, 18h57
  3. [MySQL] Requete PDO et LIMIT de SQL
    Par heretik25 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 30/06/2011, 11h25
  4. [PDO] requete PDO et bindParam
    Par totofe49 dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 18/11/2010, 18h04

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