|
Publicité ' | ||||||||||||||||||||||||
|
|
#1 |
|
Membre du Club
![]() Inscription : novembre 2007 Messages : 132 ![]() |
Salut,
Pour le moment j'évite de trop utiliser les $_GET dans mon application PHP, parce que je manque de compétences dans la sécurisation de ces variables. Ce que je fais pour le moment, c'est passer juste des paramètres numériques (comme "test.php?ajout=1"). Et après je fais ce test avant de continuer le traitement: Code :
if (isset($_GET['ajout']) && ($_GET['ajout'] == 1) && is_numeric($_GET['ajout'])) Si dans le futur je suis obligé d'utiliser les variables string vous me suggérez quelle ressource pour être sure que c'est bien sécurisé? Merci |
|
|
00
|
|
|
#2 | ||
|
Membre Expert
![]() Inscription : septembre 2010 Messages : 1 242 ![]() |
C'est pas forcément non sécurisé de passer des string comme variable dans l'URL. Cela dépend surtout à quoi te sert cette variable.
Il faut faire en sorte à la réception de la variable que celle-ci, même si elle n'est pas ce qu'on attend, ne puisse pas nuire à ton script. Ou si tu peux connaître à l'avance ce qu'elle peut contenir tu peux faire un tableau des valeurs autorisées : Code :
__________________
- Réalisations - Interface graphique : génération en javascript d'objets défilants, texte et/ou images, mode horizontal ou vertical. |
||
|
|
00
|
|
|
#3 |
|
Membre éclairé
![]() ![]() Webmaster Inscription : septembre 2007 Messages : 376 ![]() |
Salut,
il n'y a pas de règle ultime de sécurité, mais plutôt des bonnes pratiques à prendre en compte : 1) Si ta variable est utilisée pour une requête SQL, penses à la traiter avec une fonction php afin d'enlever tout caractère dangereux (addslashes, ...). 2) Si la variable sert à faire une sélection sur un ID, il faut bien tester que l'enregistrement correspondant existe 3) Comme l'a dis ABCIWEB, si pour certaines variables tu imposes des valeurs spécifiques, il faut bien tester leur validité. De toute façon, que tu passes tes variables en GET ou en POST, un utilisateur pourra toujours changer leur valeur. Il faut donc dans tous les cas mettre en place ce côté contrôle des données
|
|
00
|
|
|
#4 | ||
|
Membre actif
![]() Inscription : février 2009 Messages : 150 ![]() |
A ta place, je ferais dans ce genre :
Code :
Ce que tu as fait est bon aussi. |
||
|
|
00
|
|
|
#5 | |
|
Membre Expert
![]() Inscription : septembre 2010 Messages : 1 242 ![]() |
Citation:
...si ta variable est utilisée pour une requête SQL, penses à la traiter impérativement avec mysql_real_escape_string si tu utilise mysql ou mysqli ou fais une requête préparée si tu utilise PDO.
__________________
- Réalisations - Interface graphique : génération en javascript d'objets défilants, texte et/ou images, mode horizontal ou vertical. |
|
|
|
31
|
|
|
#6 | |||
|
Membre Expert
![]() Inscription : septembre 2010 Messages : 1 242 ![]() |
Citation:
Code :
$ajout = isset($_GET['ajout']) ? intval($_GET['ajout']) : 0;
__________________
- Réalisations - Interface graphique : génération en javascript d'objets défilants, texte et/ou images, mode horizontal ou vertical. |
|||
|
|
01
|
|
|
#7 | ||
|
Membre actif
![]() Inscription : février 2009 Messages : 150 ![]() |
Et pour encore meilleur perf, tu conserves que la variable $_GET['ajout'], et avec test empty Code :
|
||
|
|
01
|
|
|
#8 | ||
|
Membre Expert
![]() Baptiste ROUSSELÉtudiant Inscription : janvier 2011 Messages : 806 ![]() |
Attention au comportement de intval() cependant.
Code php :
__________________
|
||
|
|
10
|
|
|
#9 | |||
|
Membre Expert
![]() Inscription : septembre 2010 Messages : 1 242 ![]() |
Citation:
__________________
- Réalisations - Interface graphique : génération en javascript d'objets défilants, texte et/ou images, mode horizontal ou vertical. |
|||
|
|
00
|
|
|
#10 | ||
![]() ![]() Inscription : juin 2006 Messages : 1 384 ![]() |
Bonjour,
voici une idée de sécurisation des variables GET Code :
__________________
Les pièges de l'Internet Helix, réponse à une intrusion[ Pas de questions techniques en MP ] "La plus grande gloire n'est pas de ne jamais tomber, mais de se relever à chaque chute." Confucius "Si j’ai vu si loin, c’est que j’étais monté sur des épaules de géants." Isaac Newton |
||
|
|
00
|
|
|
#11 |
|
Membre actif
![]() Inscription : février 2009 Messages : 150 ![]() |
Oui, c'est sur que niveau performance, on va pas gagner grand chose si il y a qu'un seul test
Bon rappel transgohan Et pour empty, attention si la valeur 0 peu être envoyée. Il y a quelqu'un qui a pas l'air d'aimer nos contrôles, lui il les fait sûrement avec un simple if($_GET['ajout'] == 1) {... et en display_errors off ![]() Je signale que ces tests sont fait pour contrôler des entiers seulement... Édition : Donc après nos script contenant intval et ===, la variable ajout est prête à être utilisé dans une requête en toute sécurité. Code :
SELECT * FROM table WHERE entier=$ajout |
|
|
00
|
|
|
#12 |
![]() ![]() Inscription : juin 2006 Messages : 1 384 ![]() |
pour ma part les 0 ne sont jamais passé en GET, car j'appel l'ID du produit, d'une personne,.... d'ou ma vérification par empty.
Ensuite, je vérifie bien que la valeur est numérique car par une injetcion blind sql, il est possible de contourner une vérification trop simple (ex: dossier.php?id=1+union+select+1,@@version). La dernière vérification est présente pour vérifier que l'ID est toujours supérieur à 0 (ce qui est toujours le cas dans un table), car pour détecter des injection sql il suffit parfois de mettre un "-" devant un chiffre(ex: dossier.php?id=-1)
__________________
Les pièges de l'Internet Helix, réponse à une intrusion[ Pas de questions techniques en MP ] "La plus grande gloire n'est pas de ne jamais tomber, mais de se relever à chaque chute." Confucius "Si j’ai vu si loin, c’est que j’étais monté sur des épaules de géants." Isaac Newton |
|
|
00
|
|
|
#13 |
![]() ![]() Inscription : septembre 2010 Messages : 7 103 ![]() |
utilisez filter_input, c'est fait pour
__________________
http://blog.stealth35.com/ |
|
|
01
|
|
|
#14 | |||||
|
Membre Expert
![]() Inscription : septembre 2010 Messages : 1 242 ![]() |
Citation:
Pour la petite histoire, y'a toute une flopée de scripts "mal conçus" qui enregistrent les données en bdd avec htmlspecialchars (ou htmlentities). C'est un exemple à ne pas suivre car on encombre les tables pour rien avec ces entités html, on rend par la même occasion la table non exportable dans un format standard, on peut avoir de sérieux problèmes pour faire des recherches sur la table et j'en oublie... Aussi faudrait faire un isset($_GET['perso']) avant de définir $perso. En toute logique on commence par définir la variable et on lui applique ensuite des fonctions. Pour faire le "même" code que tu as écrit je verrais plutôt ceci : Code :
L'avantage de cette configuration est qu'il n'y a qu'à changer la première ligne si $perso est d'une autre nature. Exemple pour caster en string si on attend une chaine de caractère non vide. Code :
$perso = isset($_GET['perso']) && trim($_GET['perso']) != '' ? (string) $_GET['perso'] : null;
__________________
- Réalisations - Interface graphique : génération en javascript d'objets défilants, texte et/ou images, mode horizontal ou vertical. |
|||||
|
|
00
|
|
|
#15 |
|
Membre du Club
![]() Inscription : novembre 2007 Messages : 132 ![]() |
Est ce que tu peux nous expliquer une autre façon de gérer les apostrophes? Si l'utilisateur entre "l'oiseau" et on ne n'utilise pas htmlentities la requete ne passera pas j'imagine.
J'utilise souvent: Code :
$str = htmlentities(mysql_real_escape_string(trim($str)), ENT_NOQUOTES, "UTF-8"); |
|
|
00
|
|
|
#16 |
|
Membre Expert
![]() Eric GaridacciInscription : septembre 2005 Messages : 1 057 ![]() |
__________________
N'oubliez pas le vote des messages utiles ainsi que le Tag [Résolu].Mon Site Web : Corse - Actualité, Météo, Vidéos, Logiciels, ... |
|
|
00
|
|
|
#17 | |||||
|
Membre Expert
![]() Inscription : septembre 2010 Messages : 1 242 ![]() |
Citation:
$str = mysql_real_escape_string(trim($str)); (le trim étant en option) Cela est valable pour mysql et pour mysqli. Avec PDO c'est différent. Ensuite comme indiqué dans le lien donné par Eric2a, certains serveurs peuvent encore avoir la fonction get_magic_quotes_gpc() activée. Pour un maximum de portabilité du script il est utile d'en tenir compte et donc de supprimer les antislash insérés automatiquement (si get_magic_quotes_gpc() est activé) dans les variables gpc soit get, post, cookie. Sur ces variables on peut donc appliquer une petite fonction qui supprimera éventuellement les antislash avec stripslashes en testant la configuration get_magic_quotes_gpc() du serveur. Code :
Code :
Remarques que si tu ne vois nulle part htmlspecialchars ni htmlentities c'est qu'il n'y en a pas besoin dans ce contexte. Encore une fois ces fonctions ne servent que pour l'affichage : echo htmlspecialchars($_GET['perso']) (et donc sauf exception, elles sont précédées d'un "echo") Dernière chose il est généralement préférable (toujours pour l'affichage) d'utiliser htmlspecialchars plutôt que htmlentities. Simplement parce que si tu utilise l'utf-8 tu n'auras pas besoin de spécifier l'encodage avec htmlspecialchars et tu peux donc faire simplement echo htmlspecialchars($perso)
__________________
- Réalisations - Interface graphique : génération en javascript d'objets défilants, texte et/ou images, mode horizontal ou vertical. |
|||||
|
|
00
|
|
|
#18 | ||
|
Membre du Club
![]() Inscription : novembre 2007 Messages : 132 ![]() |
Salut,
Merci beaucoup pour vos commentaires très enrichissants. Le nombre de réponses montre la richesse du sujet, et le besoin d'y voir plus clair pour beaucoup de programmeurs. Sur internet j'ai trouvé des exemples effrayants par leur complexité; ils utilisent les expressions régulières pour écarter les cas où c'est une URL qui est soumise en paramètres ... Dans un essai de synthèse qui serait utile pour les visiteurs du site et pour m'assurer que j'ai bien compris aussi, je vous transmet un exemple qui traite uniquement le cas où la variable $_GET va figurer dans la requête sql et pour alléger le texte je ne considère pas le cas de magic quotes: Code :
|
||
|
|
00
|
|
|
#19 | ||
|
Membre Expert
![]() Inscription : septembre 2010 Messages : 1 242 ![]() |
Attention tu fais $get_var = trim($_GET['var']); sans savoir si $_GET['var'] est définie. De plus cette ligne ne sert à rien. Passe directement à la deuxième en faisant :
Code :
Pour tester l'existence d'une variable on utilise isset, ou !empty mais !empty est plus exigeant puisqu'il faut aussi que la variable soit différente de '', de 0 et de FALSE. dans Code :
if(!empty($get_var) && is_numeric($get_var) && $get_var == 5 ) { cela revient au même et c'est plus simple de dire : si la variable existe (isset) qu'elle est numérique (is_numeric) et qu'elle est égale à 5. donc Code :
if(isset($get_var) && is_numeric($get_var) && $get_var == 5 )
__________________
- Réalisations - Interface graphique : génération en javascript d'objets défilants, texte et/ou images, mode horizontal ou vertical. |
||
|
|
00
|
|
|
#20 |
![]() ![]() Inscription : septembre 2010 Messages : 7 103 ![]() |
c'est :
Code :
filter_input(INPUT_GET, 'var', FILTER_VALIDATE_INT, array('options' => array('min_range' => 1)));
__________________
http://blog.stealth35.com/ |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com