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 :

PDO et Sécurité


Sujet :

Langage PHP

  1. #1
    Membre régulier Avatar de langevert
    Profil pro
    Inscrit en
    Août 2007
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 92
    Points : 71
    Points
    71
    Par défaut PDO et Sécurité
    Bonjour,

    J'ai quelques questions pour éviter les failles php...

    Mon objectif est de:
    - Récupérer une information du client, par POST
    - Stocker cette donnée dans une BDD grâce à PDO
    - Récupérer plus tard cette donnée dans la BDD et l'afficher

    Voici mon code pour l'enregistrement de la donnée dans la BDD :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    if(isset($_POST['name']))
    {
           $name = $_POST['name'];
           $sql=$connexion->prepare('INSERT INTO Matable (name) VALUES (?)');
           $sql->execute(array($name));
    }
    PDO doit normalement protégé contre les injections SQL. Y-a-t-il une faille dans mon script ?

    Même question pour un SELECT, pour demande d'authentification:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    if(isset($_POST['login']) && isset($_POST['password']))
    {
           $login = $_POST['login'];
           $password = $_POST['password'];
           $sql=$connexion->prepare('SELECT * FROM Matable2 WHERE login=? and password=?');
           $sql->execute(array($name, $password));
    }
    Ensuite pour récupérer les infos dans ma BDD (introduite grace à mon premier exemple) et les afficher j'utilise ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    $sql=connexion->query('SELECT * FROM Matable');
    while($ligne = $sql->fetch())
    {
        $name = htmlentities($ligne['name']);
        echo $name;
    }
    Y-a-til une faille dans ce code?

    Merci d'avance pour 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
    La réponse est dans ta question : les requêtes préparées "protegent" les arguments passés.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre régulier Avatar de langevert
    Profil pro
    Inscrit en
    Août 2007
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 92
    Points : 71
    Points
    71
    Par défaut
    Oui. Mais en fait ma question c'était: Le fait comme cela protège contre les injections SQL, mais y-a-il un autre faille ? (faille xss par exemple). Est-ce que mon "htmlentities" utilisé suffit?

  4. #4
    Membre régulier Avatar de Grepsd
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2008
    Messages
    96
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Octobre 2008
    Messages : 96
    Points : 119
    Points
    119
    Par défaut
    Rajoutes ça en dernier argument de ton htmlentities() et tu seras sûr de ne pas avoir de problème à priori.

    Mais en toutes logiques le htmlentities protège parfaitement contre le XSS.

    Bonne journée.

  5. #5
    Membre régulier Avatar de Sylvain__A_
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2008
    Messages
    100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2008
    Messages : 100
    Points : 94
    Points
    94
    Par défaut
    Y'a un article là dessus dans php solutions n°29 (en couv, Flash et php)

    Mes réponses s'inspirent de cet article, et dans le même numéro, y'a un article sur PDO, j'vais essayer de synthétiser...

    Sur le Cross Site Scripting, c une sorte d'injection de javascript.

    Par ex, dans un formulaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $xss = $_GET['xss'];
    echo $xss;
    Grosse faille Pour éviter ça, il faut filtrer TOUS tes champs de formulaires, avec, pour le XSS, htmlspecialchar :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $noXSS = htmlspecialchars($_GET['xss'], ENT_QUOTES);
    echo $noxss;
    htmlspecialchar, en codant <, >, rend impossible l'injection des balises <script>, idem avec les guillemets (ENT_QUOTES).

    L'article va un peu plus loin, et insiste sur le fait que les failles sont souvent combinées. Essaye de te le procurer, c très accessible et très clair :
    Application PHP et sécurité, Antoine Beluze, PHP Solutions
    Donc oui, htmlentities protège, mais il y a aussi les failles d'apel, les injections sql, le vol de session, les attaques combinées...

    Sur PDO.

    Un des avantages c'est de pouvoir bosser avec les exceptions.

    Je site l'article :
    Manipulation en PDO, Christophe Villeneuve, PHP Solutions
    Juste un p'ti bout de code que j'ai trouvé utile :

    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
     
    try
    {
         $connexion = new PDO ( ... );
         $connexion->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
         $sql = "...";
         foreach ($connexion->query($sql) as $row)
         {
         ...
         }
         $connexion = null;
    }
    catch (PDOException $e)
    {
         echo $e->getMessage();
    }
    le setAttribute, et la constante ERRMODE_EXCEPTION, lance des exceptions.

    Là aussi, je te renvoie à l'article.

    Non, je n'ai pas d'action dans php sol

    J'espère t'avoir aidé

  6. #6
    Membre régulier Avatar de Grepsd
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2008
    Messages
    96
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Octobre 2008
    Messages : 96
    Points : 119
    Points
    119
    Par défaut
    Généralement le fait de préparer les requêtes avec PDO suffit à protéger contre les injections, après si on veut aller plus loin il va falloir lire la doc de la librairie PDO:
    http://fr3.php.net/manual/fr/book.pdo.php

    Encore une fois si tu veux un site sécurisé il ne faut pas faire confiances aux utilisateurs et filtrer tout ce qu'ils peuvent te transmettre et le remettre sous la forme attendus si ça ne l'est pas.(ou alors générer des erreurs et arrêter l'exécution)

  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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $xss = $_GET['xss'];
    echo $xss;
    Oui enfin la l'utilisateur affiche juste ce qu'il a tapé.
    S'il veut se pourrir lui même ...
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  8. #8
    Membre régulier Avatar de Sylvain__A_
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2008
    Messages
    100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2008
    Messages : 100
    Points : 94
    Points
    94
    Par défaut
    oui, c vrai, mais c pour aller vite, mon message faisait déjà moults lignes.

    C pour dire que le champ est pas filtré, et que donc on peut essayer quelque chose comme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <script>window.location.replace('urlmalveillante.com');</script>

Discussions similaires

  1. [MySQL] Sécurité - PDO/MYSQL et Procédure Stockée
    Par SaleGamin dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 10/03/2012, 20h18
  2. PDO et sécurité
    Par rikemSen dans le forum Langage
    Réponses: 4
    Dernier message: 20/12/2010, 10h24
  3. [PDO] Sécurité avec PDO
    Par Mandarine dans le forum PHP & Base de données
    Réponses: 9
    Dernier message: 02/12/2010, 11h42
  4. La Sécurité dans Access
    Par Maxence HUBICHE dans le forum Sondages et Débats
    Réponses: 81
    Dernier message: 24/06/2007, 01h07
  5. 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