7
votes

PHP mysql $ _get prévention du piratage

Dupliqué possible:
meilleur moyen d'arrêter l'injection SQL dans PHP

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? xxx


1 commentaires

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 ())));


4 Réponses :


5
votes

Cela dépend totalement de ce que vous allez faire avec cela:


10 commentaires

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 (); 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 ['...'] .


C'est un excellent conseil! Y a-t-il quelque chose à faire des valeurs alphanumériques seulement?


Alors quelque chose comme Bonjour serait également "Bcenterhellocenterb" aussi, je pense que je me souviens de quelque chose à propos de la décapage des tags HTML afin qu'il apparaisse simplement comme "bonjour", comment je fais ça?


@Albert Renshaw Vous devrez probablement avoir recours à des expressions régulières comme [\ w \ d] + mais si vous êtes coincé là-bas, vous feriez mieux de poser une question plus précise.


@Albert Renshaw strip_tags ($ string)


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



-1
votes

lire $ _GET variables RAW n'est pas dangereux,

Le danger réside généralement dans les injections SQL,

par exemple: xxx

avec La requête: xxx

pour empêcher ceci: xxx


10 commentaires

-1. mysql_real_escape_string () ne toujours 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 () 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 pour la pagination. Si $ page contient 1; Table de chute TBL - , 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 et intval ).


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' . Si $ passe est 'ou 1 = 1 - , 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 () est qu'il remplace "avec \ ', etc., donc l'entrée ne peut pas casser l'encapsulation. 'foo \' bar ' ne provoquera pas d'erreur, mais ' foo 'bar' sera. Et oui, intval 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 () .



3
votes

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:


2 commentaires

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.