[resolu]$_GET et securisation

Eléphanteau du PHP | 19 Messages

14 oct. 2005, 09:39

Bonjour.
Quels sont les risques encourrus lorsque l'on utilise la $_Get pour envoyer une requete a la base de données comme par exemple afficher une news N°=$_GET ?
Merci a vous si vous pouvez me renseigner et si il y a risques quels sont les moyens de s'en prevenir ou de les limiter.
Je vous remercie par avance et vous souhaite une tres bonne journée
Modifié en dernier par jeanpierre949 le 17 oct. 2005, 10:16, modifié 1 fois.

Mammouth du PHP | 19672 Messages

14 oct. 2005, 09:43

Salut,
Le danger de la méthode get est qu'on peut facilement envoyer des données truquées via l'url dans une intention malveillante et modifier ainsi une requête SQL : c'est l'injection SQL avec tout ce que ça peut comporter comme surprises en général désagréables. C'est pour cette même raison que par défaut la directive register_globals est par défaut à OFF depuis la version 4.2 de PHP.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

14 oct. 2005, 09:43

les données récupérée depuis la superglobale $_GET sont des données contenues dans l'url

Dès que tu as compris ça, tu comprendra aisément que n'importe qui peut modifier ces données dans l'url avant de soumettre la page et t'envoyer n'importe quoi

Après, il peut y avoir 2 manières de penser :
- ne rien envoyer en GET
- vérifier TOUT ce que tu récupère

Je suis partisant de la 2nd sachant que je ne l'applique pas qu'au GET mais à toutes les variables transmises
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphanteau du PHP | 19 Messages

14 oct. 2005, 09:59

Bonjour.
Merci pour vos reponses donc s'il y a risques quel est le moyen de s'en? proteger parceque moi je suis plutot ignare dans ce domaine

Mammouth du PHP | 19672 Messages

14 oct. 2005, 10:16

Pour t'en protéger, il y a une règle d'Or : Ne JAMAIS faire confiances aux données envoyées par un internaute et systématiquement effectuer des tests sur ces données avant toute insertion dans une base de données.

En outre, il est préférable d'adopter une technique de codage rigoureuse et disciplinée, et d'éviter l'utilisation de la méthode get quand la méthode post peut fort bien effectuer la même opération sans possibilité de manipulation des données.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphanteau du PHP | 19 Messages

14 oct. 2005, 10:31

Merci.
dans mon cas il n'est pas quetion de transmettre des données a inserer dans la base par la $_GET mais simplement de lire une information dans la base c'est pourquoi je ne comprends pas comment on pourrait inserer des données malveillantes puisque ce n'est pas pour inserer mais juste recuperer et afficher donc je ne vois pas comment m'en proteger .
Je suis lourd (hein) mais franchement je debute et j'aimerais comprendre

Mammouth du PHP | 19672 Messages

14 oct. 2005, 10:46

Bon, ok, je vais essayer d'être moins abscons.

La méthode get transmet des données en les concaténant à l'utl. On les récupère ensuite sur la page dans la super-globale $_GET. Jusque là, je ne t'apprends rien. Les limites de cette méthode restent cependant importantes: la longueur d'une url est limitée selon les navigateurs entre 400 et 700 caractères environ. Le problème qui peut se poser en outre, c'est que l'internaute peut modifier les données de l'url pour faire afficher autre chose que ce qu'il a le droit de voir. Par exemple, on envoie par l'url des informations sur un bon de commande et on adjoint aux dnnées de l'url un numéro de client : si on modifie manuellement le numéro de client et que la récupération des données n'est pas rigoureuse, on risque de voir des petits malins se ballader dans les bons de commandes de toute le monde. On peut penser qu'un concurrent peu scrupuleux pourrait ainsi se forger une base de connaissance sur ta clientèle afin de cibler une attaque commerciale.

Un autre problème que pose la méthode get est le référencement des pages dans les moteurs de recherche : des moteurs comme Google n'acceptent pas plus de deux paramètres pour indexer une page. On peut toutefois contourner ce problème avec l'url-rewriting.

Alors je ne sais pas si ça répond à ton interrogation : dans le cas contraire, essaye de m'illustrer ton propos par un exemple type de ce que tu veux faire. J'ai bien une vague idée, mais je ne suis pas sûr et il est possible qu'une des solutions envisageable ne soit ni get ni post mais des variables de session.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

14 oct. 2005, 10:52

c'est pourquoi je ne comprends pas comment on pourrait inserer des données malveillantes puisque ce n'est pas pour inserer mais juste recuperer et afficher
imagine que ta requete soit

Code : Tout sélectionner

SELECT * FROM table WHERE id='"$_GET["id"]."'";
et que quelqu'un marque

Code : Tout sélectionner

15;DELETE * FROM table;
Dans l'url. la requete generée est donc

Code : Tout sélectionner

SELECT * FROM table WHERE id=15;DELETE * FROM table;
Et tu te retrouve avec une table en moins parce qu'il y a des noms de tables qui reviennent souvent : user, commande, produit

Tu t'immagines perdre une table de commandes ?
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphanteau du PHP | 19 Messages

14 oct. 2005, 11:17

Je commence a comprendre mais c'est pas encore tout a fait clair aussi je vous donne l'url de la page et vous demande d'inserer une requete pas trop mechante svp pour voir le resultat
http://charles.cc30.free.fr/msn/actu/news.php

Eléphant du PHP | 337 Messages

14 oct. 2005, 20:11

Eeeuh il commence sérieusement à m'inquiéter ce sujet :shock:

Edit : j'ai regardé ça plus attentivement... cela signifie que pour une requête de type "SELECT * FROM table WHERE id='$_GET[id]'", si un utilisateur quelconque connaît, devine ou essaye au hasard un nom de table existant sur la base, il peut simplement en ajoutant "15; DELETE * FROM table" supprimer une table entière ?

Parce que des requêtes comme ça, j'en utilise plein :?
Modifié en dernier par finipe le 14 oct. 2005, 20:25, modifié 2 fois.

Mammouth du PHP | 19672 Messages

14 oct. 2005, 20:20

Eeeuh il commence sérieusement à m'inquiéter ce sujet :shock:
Faut pas non plus devenir parano, mais il est important de le savoir. Une programmation propre et une discipline de codage sont les prmières règles à observer. Ensuite, la règle d'Or que j'ai cité plus tôt : ne jamais faire confiance aux données de l'utilisateur. Enfin, faire en sorte que des données qui interviennent d'une manière ou d'une autre vers une base de données soient traitées correctement justemet pour éviter que des petits malins ne fassent les caves. Il y a sur PHPFrance un excellent tuto sur la manière de traiter des données avant envoi vers une base de données : les magic_quotes à lire attentivement et à prendre au sérieux.

Si un pirate du dimanche vous met un livre dor par terre, ça n'aura pas d'autre conséquence qu'une frustration et une envie de pendre le malfaisant pas les oreilles au sommet de la tour Eiffel un soir d'hiver venteux. Imaginez maintenant qu'il s'agisse d'un site de vente en ligne qui gère des milliers d'articles différents ... je vous laisse deviner ce que ça peut représenter comme catastrophe.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 337 Messages

14 oct. 2005, 20:25

Oops, déjà répondu... Je recommence, désolé :

J'ai regardé ça plus attentivement... cela signifie que pour une requête de type "SELECT * FROM table WHERE id='$_GET[id]'", si un utilisateur quelconque connaît, devine ou essaye au hasard un nom de table existant sur la base, il peut simplement en ajoutant "15; DELETE * FROM table" supprimer une table entière ?

Parce que des requêtes comme ça, j'en utilise plein :?

Mammouth du PHP | 19672 Messages

14 oct. 2005, 20:39

C'est ça, mais avec simplement un codage propre, tu vas limiter les dégats. Partons de taq requête:
SELECT * FROM table WHERE id='$_GET[id]'"
Dans un cas comme celui-ci, tu te sers d'un numérique comme point de repère : La première chose à faire est de ne pas utiliser $_GET['id'] dans la requête elle-même. Tu feras donc la chose suivante:
$id = isset($_GET['id']) ? $_GET['id'] ? "";
if(is_numeric($id))
{
    $sql = "SELECT * FROM table WHERE id='". $id ."'";
}
else
{
    echo("<p>L'identifiant est inccorect, veuillez sélectionner à nouveau votre article</p>\n"); // par exemple...
}
Là, tu court-circuite toute tentative d'ajout parce que si l'identifiant n'est pas un numérique, il n'y aura pas de requête du tout, donc si un petit futé ajoute quoique ce soit, c'est loupé d'avance.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

14 oct. 2005, 20:40

juste au passage, mysql_query n'accepte qu'une seule requête SQL à la fois ;)

mais le principe exposé reste valable, il peut arriver de modifier le code d'une requête envoyée... :roll:

Administrateur PHPfrance
Administrateur PHPfrance | 149 Messages

14 oct. 2005, 21:43

il y a plein de ressources sur le web on peut se faire une liste d'url ici non ?
et on les rajoute toutes dans le 1er post du thread
--
Moosh - ancêtre de la communauté
http://www.phpfrance.com