PHP et injection sql quelles protection dans quel cas ?

Moderator: Mod

PHP et injection sql quelles protection dans quel cas ?

Postby GOLGOTA » Sat Sep 25, 2010 11:51 am

Bonjour,

J'ai pour l'instant fini le gros de mon code de la première version de mon site.

Et là je m'intéresse très particulièrement à la sécurité.

Avec mes différentes petite recherches j'ai découvert plusieurs fonctions permettant de protégé des variables contre les injection sql. Mais je commence un peu à m'embrouiller.

addslashes()
stripslashes()
htmlspecialchars()
msql_real_escape_string()

Sont celles que je connais.

Si je contrôle les informations qui entrent dans la base de données, est-ce que je dois aussi contrôlée celle qui en sortent (donc qui sont affichées) ?

stripslashes() est pas mal pour viré les slash, mais prenons par exemple un formulaire de post de commentaire sur un article. Je dois contrôler le contenu, si je rajoute des slashe (avec addslashes() ) à l'entrée du script, mais que je les retires ensuite (avec stripslashes() ), cela pourrait activer un javascript par exemple ?

Je n'ai pas encore très bien compris ce que fait réellement htmlspecialchars(), est-ce qu'il rajoute ou enlève t-il des caractères ? (j'ai plus l'impression que c'est pour éviter de pouvoir mettre du code html, mais je n'en suis pas sûr).

Pour mysql_real_escape_string(), si j'ai bien compris je dois l'utiliser QUE pour contrôler les infos qui sont entrée dans un formulaire mis à disposition sur le site ?

Mais avec toutes ces fonction, je me perd un peu et je n'arrive pas à savoir exactement dans quel cas les utiliser.

Donc pour préciser ma question :
Quelles fonctions dois-je préférer dans les deux cas suivant :

1. Lorsque l'utilisateur entre des données via un formulaire.
2. Lorsque je prend des infos de la base et qu'un code pourrait y être contenu.

Merci d'avance pour votre aide :)

Golgota

EDIT : Bon après encore quelques recherches et quelques lectures en plus voici ce que j'en conclu (et dites moi si je me trompe) :

htmlspecialchars() : Change des caractères propre au html pour qu'ils soient lisible comme par exemple quand on prend un texte, dans une base de données, qui doit affiché le code pour qu'il soit lu. Donc ça évite d'executer du code.

addslashes() : Ajoute des anti-slash pour évité l'utilisation de caractère comme les ' ou les " . Donc ça permet d'éviter une injection sql.

mysql_real_escape_string() : Permet d'empecher l'utilisation de chaînes de caractères comme NULL, \x00, \n, \r, \, ', " et \x1a. Empêche les injection sql.

et enfin stringslashes() : Enlève les anti-slash dans une chaine de caractères.

Donc si j'ai bien compris :
htmlspecialchars(), addslashes() et mysql_real_escape_string() sont à appliquées lors de l'envoie de donnée dans la base de données. Et ce pour éviter d'injecter du code.

Et addslashes() doit être utilisé lors de l'affichage des données pour éviter d'avoir des anti-slash dès qu'on veut afficher des phrase avec des ' ou des " .

Voilà, me trompes-je ? :D
GOLGOTA
Projets
 
Posts: 23
Joined: Wed Aug 04, 2010 12:15 pm

Postby GRIMMJOWBO » Sat Sep 25, 2010 2:52 pm

Non tu ne trompes pas :) . Tu vois en cherchant, tu n'a pas eu besoin d'aide.

P.S: addslashes ne sert à rien si get_magic_quotes_gpc est activé. Utilise get_magic_quotes_gpc, mysql_real_escape_string et htmlspecialchars(). mysql_real_ecape_string est utilisé lors de l'envoie d'une requête sql et htmlspecialchars() est souvent utilisé dans les echo.
A+ :wink:
User avatar
GRIMMJOWBO
 
Posts: 778
Joined: Fri May 07, 2010 7:14 pm
Location: France

Postby GOLGOTA » Sat Sep 25, 2010 3:15 pm

Question bête, mais j'utilise PDO pour la gestion du sql.
Et je viens de tomber sur ça :
http://fr.php.net/manual/fr/pdo.prepared-statements.php

Il y est dit que PDO gère la protection contre les attaque SQL.

Donc plus besoin de mysql_real_escape_string ou get_magic_quotes_gpc ?
GOLGOTA
Projets
 
Posts: 23
Joined: Wed Aug 04, 2010 12:15 pm

Postby GRIMMJOWBO » Sat Sep 25, 2010 3:33 pm

"Si votre application utilise exclusivement les requêtes préparées, vous pouvez être sûr qu'aucune injection SQL n'est possible (Cependant, si vous construisez d'autres parties de la requête en vous basant sur des entrées utilisateurs, vous continuez à prendre un risque)."
Voilà :wink:
User avatar
GRIMMJOWBO
 
Posts: 778
Joined: Fri May 07, 2010 7:14 pm
Location: France

Postby GOLGOTA » Sat Sep 25, 2010 3:52 pm

Donc l'utilisation de msql_real_escape_string est inutile, mais je dois toujours protégé les variable avec addslashes() et htmlspecialchars () ?
Dans cet exemple repris sur la page du lien vers la doc php :
[code:1:3bba1f9e6c]
<?php
$stmt = $dbh->prepare("SELECT * FROM REGISTRY where name = ?");
if ($stmt->execute(array($_GET['name']))) {
while ($row = $stmt->fetch()) {
print_r($row);
}
}
?>
[/code:1:3bba1f9e6c]
Il est dit :

[quote:3bba1f9e6c]Cet exemple récupère des données basées sur la valeur d'une clé fournie par un formulaire. L'entrée utilisateur est automatiquement échappée, il n'y a donc aucun risque d'attaque par injection SQL.
[/quote:3bba1f9e6c]
Il n'utilise pas mysql_real_escape_string.
Donc effectivement, PDO se charge d'une partie de la sécurisation contre les inejection SQL, mais le programmeur doit quand même veiller à protéger ses variables.
GOLGOTA
Projets
 
Posts: 23
Joined: Wed Aug 04, 2010 12:15 pm

Postby GRIMMJOWBO » Sat Sep 25, 2010 3:56 pm

[quote:5c6cad497f="GOLGOTA"]mais le programmeur doit quand même veiller à protéger ses variables.[/quote:5c6cad497f]
Evidemment! Je répond en vitesse car j'ai pas trop le temps mais htmlspecialchars()doit être utilisé pour éviter la xss par exemple ça n'a rien à voir avec l'injection sql.
A+ :wink:
User avatar
GRIMMJOWBO
 
Posts: 778
Joined: Fri May 07, 2010 7:14 pm
Location: France


Return to Php

Who is online

Users browsing this forum: No registered users and 2 guests

cron