Dupliqué possible: strong>
meilleur moyen d'arrêter l'injection SQL dans PHP p>Si je devais utiliser la fonction $ _GET pour récupérer une variable de l'URL Comment puis-je le faire pirater la preuve? À l'heure actuelle, je n'ai que desdslashes, que dois-je ajouter d'autre? P>
xxx pré> blockquote>
4 Réponses :
Cela dépend totalement de ce que vous allez faire avec cela: p>
Sans savoir ce que vous allez faire avec vos données, il est impossible de dire ce qui le rendrait en sécurité. P>
Disons que je l'utilisais comme la façon dont la personne ci-dessous l'a dit (je n'ai actuellement pas une utilisation spécifique que j'essaie simplement d'apprendre alors quand je déciderai d'utiliser l'avenir, je l'utiliserai en toute sécurité ... de toute façon , disons: mysql_query ("Sélectionnez Userid à partir de l'utilisateur où mot de passe = '". $ _ obtenir ["variable1"]. "';");
Mots de passe que vous devriez généralement ne pas lire à partir de variables. Utilisez un champ de mot de passe sous forme de message (HTML) à la place. Et les mots de passe doivent toujours être sécurisés de MD5 () - sécurisé. (Pour un mot de passe, vous n'auriez besoin que de mysql_real_escape_string (); code> parce que vous ne l'imprimerez pas.
D'accord génial! Maintenant, qu'en est-il de quelque chose comme afficher la page de profil d'un utilisateur et ce n'était pas un mot de passe juste un numéro ... comme 54038. Et je récupérais et affichantais toutes les entrées de la table où ce numéro de l'utilisateur était dans un champ appelé "userid" quel type de L'injection pourrait être nocif et comment puis-je l'empêcher?
@ALBERT RENSHAW Vous devez connaître vos données, si un champ est censé être un entier, vous le feriez mieux à un entier: (int) $ _GET ['...'] code>.
C'est un excellent conseil! Y a-t-il quelque chose à faire des valeurs alphanumériques seulement?
Alors quelque chose comme
@Albert Renshaw Vous devrez probablement avoir recours à des expressions régulières comme [\ w \ d] + code> mais si vous êtes coincé là-bas, vous feriez mieux de poser une question plus précise.
@Albert Renshaw strip_tags ($ string) code>
Pour une sécurité de mot de passe appropriée, assurez-vous de lire Vous 'Re probablement stocker des mots de passe incorrectement .
Pour le filtrage en PHP, consultez php.net/filter
lire $ _GET variables RAW n'est pas dangereux,
Le danger réside généralement dans les injections SQL, P>
par exemple: p> avec La requête: p> pour empêcher ceci: p>
-1. mysql_real_escape_string () code> ne toujours i> empêche les injections. Cela pourrait donner à OP l'idée que s'il ne s'échappe pas, il n'aura plus jamais à s'inquiéter des injections SQL.
mysql_real_escape_string est bon! De plus, quelles autres moyens communs de prévention des anons de Kristian?
@Albertrenshaw mysql_real_escape_string () code> n'échappe que les tiques, les guillemets et similaires. En supposant qu'il n'y en ait pas, ce n'est pas utile du tout. Un exemple est avec limite 10, $ page code> pour la pagination. Si $ page code> contient 1; Table de chute TBL - code>, l'échappement ne vous aiderait pas un peu. Validez toujours votre entrée et assurez-vous que vous avez la bonne valeur (E.G. is_numérique code> et intval code>).
Quelle est l'intuition derrière "'ou 1 = 1 -"? J'ai vu cette déclaration (ou une personne similaire) écrite avant de prévenir les articles de prévention du piratage. Cela fait une erreur via la logique droite? Cet interne affiche-t-il un message d'erreur avec des informations sensibles?
is_numérique! Wow! C'est super! Ahhh, c'est bien! Merci! Cela aidera beaucoup avec chose comme des numéros de page! Doux! Merci! +1
@ALBERTRENSHAW Non, cela ne fait aucune erreur que cela revient simplement. Considérez un mauvais système de connexion, Sélectionnez Nom d'utilisateur à partir de TBL où Nom d'utilisateur = '$ utilisateur' et mot de passe = '$ passer' code>. Si $ passe est 'ou 1 = 1 - code>, la requête serait Sélectionnez Nom d'utilisateur à partir de TBL où nom d'utilisateur =' $ utilisateur 'et mot de passe =' 'ou 1 = 1 -' < / Code>, renvoie ainsi le nom d'utilisateur et dirige l'application pour croire que le mot de passe correct a été entré.
Ohhhhhh !!! Cela fait beaucoup plus de sens! Ok, c'est bon conseil, alors mysql_real_escape_string (); empêchera ce type de piratage?
En outre, pour une référence future d'autres personnes désemparées comme moi. (trouvé cela avec Google) Si vous essayez d'utiliser la fonction Kristian donnée, "Intval ();" Et vous avez un numéro mais ce n'est pas un entier (E.G 4.389) IntTval reviendra 4, mais si vous souhaitez conserver la valeur numérique complète, mais vous déshabiller toujours des objets comme des lettres et des requêtes SQL que vous pouvez utiliser "Floateval ();"
Non, tous mysql_real_escape_string () code> est qu'il remplace "avec \ ', etc., donc l'entrée ne peut pas casser l'encapsulation. 'foo \' bar ' code> ne provoquera pas d'erreur, mais ' foo 'bar' code> sera. Et oui, intval code> ne renvoie que 4 - évidemment, il renvoie la valeur entière, pas la valeur du point flottant. :)
Je n'ai pas pris le temps de faire cette post élaborer, mais de voir tous les commentaires, oui, mysql_real_escape_string () empêchera toutes les injections SQL dans une chaîne uniquement, pour les valeurs numériques, vous devez vérifier avec IS_Numeric () avant d'exécuter MySQL_Query () .
Les deux plus grands risques auxquels vous êtes confrontés lors de l'utilisation de l'utilisateur (toutes les comptes de requête HTTP en tant que saisie de l'utilisateur) sont les suivants: P>
Vous devez vous familiariser avec les risques et les défenses. Les défenses de chacune de ces menaces sont différentes. Utilisation de AddSlashes () n'est pas une défense complète. P>
Une excellente ressource pour apprendre plus sur la programmation Web sécurisée est le Owasp Top Ten Project < / a>. p>
J'ai fait une présentation sur Mythes d'injection SQL et Fallacies < / a> que j'espère que c'est utile pour vous. P>
J'ai remarqué dans un autre commentaire d'un autre utilisateur, ils ont déclaré que «l'injection XSS» est-ce que cela représente une injection de script de site croisée?
Oui, XSS est une abréviation populaire pour les scripts croisés.
La première règle avant toute entrée, pas seulement $ _GET, mais même avec $ _post, $ _files et tout ce que vous lisez à partir du disque ou à partir d'un flux, vous devez toujours valider.
MAINTENANT pour répondre à votre question dans plus de détails , vous avez plusieurs hacks qui existent dans ce monde. Laissez-moi vous montrer certains: p>
Injections XSS XSS strong> p>
Si vous acceptez les données de l'URL, telles que $ _GET et sortir ces données sans dépôt possible. Tags, vous pourriez rendre votre site sujette à l'injection XSS ou à l'injection de code. Par exemple: P>
//In this file we include myhotfile.txt include($_GET['show']);
Alors, comment puis-je le faire afin que mon script PHP ignorera les requêtes SQL qui sont récupérées via $ _GET? Merci pour tous les exemples aussi!
mysql_real_escape_string ou si vous utilisez du PDO ou une bonne couche de DB, cela le fait généralement pour vous ...
Qu'est-ce que "PDO", que signifie-t-il et comment puis-je l'utiliser? J'ai vu cela à venir beaucoup! Merci encore pour toute l'aide jusqu'à présent!
php.net/manual/fr/book.pdo.php - Data PHP Objets
Et "XSS" représente-t-elle des scripts croisés? J'ai vu cela dans la réponse d'un autre utilisateur.
Oui, XSS est le script de site croisé
Pour une référence future, il s'agit de ma fonction de protéger les valeurs numériques dans la fonction GET (supprimer le flottval (); fonction pour les valeurs d'obtention non numériques):
addSlashes (mysql_real_escape_string (Strip_tags (FloaTval ()))); Code>