Assainir les données de l'utilisateur dans GET by PHP

comment épurer les données en $_GET-variables par PHP?

Je désinfecte une seule variable dans GET par strip_tags . Je ne sais pas si je dois tout nettoyer ou pas, parce que la dernière fois en mettant des données à Postgres, le problème a été plus facilement résolu par l'utilisation de pg_prepare .

27
demandé sur Léo Léopold Hertz 준영 2009-08-22 02:46:10

4 réponses

comment épurer les données en $ _GET-variables par PHP?

Vous ne pas désinfecter les données dans $_GET. C'est une approche courante dans les scripts PHP, mais c'est complètement faux*.

toutes vos variables doivent rester sous forme de texte clair jusqu'au moment où vous les intégrez dans un autre type de chaîne. Il n'y a pas une seule forme de fuite ou de ‘sanitization’ qui peut couvrir tous les types possibles de chaîne vous peut-être l'intégration de vos valeurs.

donc si vous intégrez une chaîne dans une requête SQL, vous devez l'échapper en sortant:

$sql= "SELECT * FROM accounts WHERE username='".pg_escape_string($_GET['username'])."'";

et si vous crachez la chaîne en HTML, vous devez l'échapper alors:

Cannot log in as <?php echo(htmlspecialchars($_GET['username'], ENT_QUOTES)) ?>.

si vous avez fait ces deux étapes d'évasion sur le tableau $_GET au début, comme recommandé par les gens qui ne savent pas ce qu'ils font:

$_GET['username']= htmlspecialchars(pg_escape_string($_GET['username']));

alors quand vous aviez un ’ & ‘ dans votre nom d'utilisateur, il se transformerait mystérieusement en ’ & ' dans votre base de données, et si vous aviez une apostrophe dans votre nom d'utilisateur, elle se transformerait en deux apostrophes sur la page. Puis quand vous avez une forme avec ces caractères dans Il est facile de finir par échapper double choses quand ils sont édités, ce qui est pourquoi tant de mauvais CMSs PHP finissent avec des titres d'article cassés comme " nouveaux livres de O\\\\\\\\\\\\\\\\\\\'Reilly".

naturellement, en se rappelant à pg_escape_string ou mysql_real_escape_string et htmlspecialchars chaque fois que vous envoyez une variable est un peu fastidieux, c'est pourquoi tout le monde veut le faire (à tort) en un seul endroit au début du script. Pour la sortie HTML, vous pouvez au moins sauver quelques dactylos en définissant une fonction avec un nom court qui fait écho(htmlspécialchars(...)).

pour SQL, il est préférable d'utiliser des requêtes paramétrées. Pour Postgres il y a pg_query_params . Ou, en effet, préparé déclarations comme vous l'avez mentionné (bien que je les trouve personnellement moins gérables). Dans tous les cas, vous pouvez alors oublier de "nettoyer" ou de vous échapper pour SQL, mais vous devez quand même vous échapper si vous avez intégré d'autres types de chaînes, y compris HTML.

strip_tags () n'est pas une bonne façon de traiter les entrées pour l'affichage HTML. Dans le passé, il a eu des problèmes de sécurité, car les analyseurs de navigateur sont en fait beaucoup plus compliqué dans leur interprétation de ce qu'une étiquette peut être que vous pourriez penser. htmlspecialchars () est presque toujours la bonne chose à utiliser à la place, de sorte que si quelqu'un tape un signe moins-que, il obtiendra en fait un signe moins littéral-que et ne trouvera pas la moitié de son texte mystérieusement en train de disparaître.

(*: comme une approche générale pour la résolution de l'injection de problèmes, de toute façon. Naturellement, il y a des vérifications spécifiques au domaine qu'il vaut la peine de faire sur des champs particuliers, et il y a des tâches de nettoyage utiles que vous pouvez faire comme supprimer tous les caractères de contrôle des valeurs soumises. Mais ce n'est pas ce que la plupart des codeurs PHP signifient par assainissement.)

75
répondu bobince 2009-08-22 11:27:55

si vous parlez d'assainir la sortie, je vous recommande de stocker le contenu dans votre base de données dans sa forme complète, non enregistrée, et puis de l'échapper ( htmlspécialchars ou quelque chose du genre) lorsque vous faites écho des données, de cette façon vous avez plus d'options pour la sortie. Voir cette" question pour une discussion sur l'assainissement/l'évasion du contenu de la base de données.

en termes de stockage dans postgres, utilisez pg_escape_string sur chaque variable de la requête, pour échapper aux guillemets, et généralement protéger contre L'injection SQL.

Edit:

mes étapes habituelles pour stocker des données dans une base de données, puis les extraire, sont:

  1. appelez la fonction d'échappement des données de la base de données (pg_escape_string, mysql_escape_string, etc), pour échapper à chaque variable $_GET entrante utilisée dans votre requête. Notez que l'utilisation de ces fonctions à la place d'addslashes il en résulte que le texte ne comporte pas de barre oblique supplémentaire lorsqu'il est stocké dans la base de données.

  2. lorsque vous récupérez les données hors de la base de données, vous pouvez simplement utiliser des caractères spéciaux htmlsur n'importe quelle donnée extraite, pas besoin d'utiliser des tirets, car il ne devrait pas y avoir de tirets supplémentaires.

5
répondu Kazar 2017-05-23 11:54:48

vous devez épurer toutes les requêtes, pas seulement postez comme GET.

vous pouvez utiliser la fonction htmlentities() , la fonction preg_replace() avec regex, ou filtrer par coulée:

<?
$id = (int)$_GET['id'];
?>

[]

3
répondu fvox 2009-08-21 23:07:59

Assainissez vos entrées selon leur destination.

  • si vous l'affichez (sur une page ou comme valeur d'un champ d'entrée), utilisez htmlspecialchars et/ou str_replace .
  • Si vous l'utilisez comme un autre type, le jeter.
  • si vous l'incluez dans la requête SQL, échappez-vous en utilisant la fonction appropriée, peut-être rayer les balises html si vous voulez qu'elles soient totalement supprimées (ce qui n'est pas la même chose que échappé).

idem pour les données POST ou même de votre base de données, car les données à l'intérieur de votre base de données ne doivent généralement pas être échappées.

deux choses à vérifier:

  1. Codage de votre entrée vs vos scripts PHP / sortie / DB tableau
  2. si vous avez activé [magic_quotes_gpc][1] , vous devez désactiver les valeurs GET, POST et COOKIE (lorsque vous le pouvez) ou stripslashes() . magic_quotes_gpc est déprécié, vous devez désinfecter le les données que vous manipulez, en fonction du utilisez de ces données.
2
répondu instanceof me 2009-08-21 23:34:45