66 votes

Quelles sont les meilleures pratiques pour éviter les attaques xss dans un site PHP

J'ai PHP configuré de sorte que les magic quotes sont sur et register globals sont éteints.

Je fais de mon mieux pour toujours faire appel à htmlentities() pour tout ce que je suis outputing qui est dérivée à partir de la saisie de l'utilisateur.

J'ai aussi parfois seach ma base de données à pour la commune choses dans xss attaché comme...

<script

Que dois-je faire et comment faire en sorte que les choses que je suis en train de faire sont toujours fait.

58voto

Michał Rudnicki Points 8424

S'échapper d'entrée n'est pas le meilleur que vous pouvez faire pour la réussite de XSS la prévention. Également la sortie doit être échappé. Si vous utilisez le moteur de template Smarty, vous pouvez utiliser |escape:'htmlall' modificateur de convertir tous sensibles caractères en entités HTML (j'utilise propre |e modificateur qui est un alias de la ci-dessus).

Mon approche de l'entrée/sortie de sécurité est:

  • magasin de saisie de l'utilisateur non modifié (pas de code HTML échapper à l'entrée, seulement DB-courant de l'échappement via PDO déclarations préparées à l'avance)
  • échapper à la sortie, selon le format de sortie que vous utilisez (par exemple, HTML et JSON besoin de différents échapper règles)

18voto

Jilles Points 626

Je suis d'avis qu'on ne devrait pas échapper à quoi que ce soit pendant l'entrée, seulement sur la production. Depuis (la plupart du temps) vous ne pouvez pas supposer que vous savez où des données est en cours. Exemple, si vous avez la forme de données que, plus tard, apparaît dans un e-mail que vous envoyez, vous avez besoin de différentes de s'échapper (sinon, un utilisateur malveillant pourrait réécrire votre e-mail-en-têtes).

En d'autres termes, vous ne pouvez échapper au dernier moment les données est de "partir" de votre application:

  • Élément de la liste
  • Écrire dans un fichier XML, échapper pour XML
  • Écrire DB, escape (pour le SGBD)
  • Écrire des e-mails, d'évasion pour les e-mails
  • etc

Pour faire court:

  1. Vous ne savez pas où vos données
  2. Les données peuvent effectivement se retrouver dans plus d'un endroit, d'avoir besoin de différents échapper du mécanisme, MAIS PAS les DEUX
  3. Des données s'est échappé pour se tromper de cible n'est vraiment pas beau. (E. g. recevez un e-mail avec le sujet "Aller à Tommy\'s bar".)

Esp #3 aura lieu si vous vous échappez de données à la couche d'entrée (ou vous avez besoin de s'échapper à nouveau, etc).

PS: je vais le deuxième des conseils pour ne pas utiliser les magic_quotes, ceux-ci sont mal pur!

12voto

christian studer Points 5948

Il y a beaucoup de façons de le faire XSS (Voir http://ha.ckers.org/xss.html) et c'est très difficile à attraper.

Personnellement, je déléguer cela à le cadre actuel que j'utilise (Code de l'Allumeur par exemple). Tout n'est pas parfait, il pourrait prendre plus de ma main qui a fait routines jamais le faire.

10voto

Matt Farina Points 394

C'est une grande question.

Tout d'abord, ne pas s'échapper de texte sur l'entrée, sauf pour le rendre sûr pour le stockage (tels que de la mettre dans une base de données). La raison pour cela est que vous voulez conserver ce qui a été d'entrée de sorte que vous pouvez contextuellement présenter de différentes façons et les lieux. Les modifications apportées ici peut compromettre votre présentation plus tard.

Quand vous allez à présent votre filtre de données, ce qui ne devrait pas être là. Par exemple, si il n'y a pas de raison pour que javascript soit il le rechercher et de le supprimer. Un moyen facile de le faire est d'utiliser la strip_tags de la fonction et de présenter les balises html, vous permettant.

Ensuite, prenez ce que vous avez et de transmettre la pensée htmlentities ou htmlspecialchars pour changer ce qu'il y a de caractères ascii. Le faire en se fondant sur le contexte et ce que vous voulez obtenir.

Je voudrais, également, suggèrent éteindre les Magic Quotes. Il a été supprimé à partir de PHP 6 et est considéré comme une mauvaise pratique à utiliser. Des détails à l' http://us3.php.net/magic_quotes

Pour plus de détails, consultez http://ha.ckers.org/xss.html

Ce n'est pas une réponse complète, mais, espérons-le, assez pour vous aider à obtenir commencé.

7voto

Mason Points 1978

rikh Écrit:

Je fais de mon mieux pour toujours faire appel à htmlentities() pour tout ce que je suis outputing qui est dérivée à partir de la saisie de l'utilisateur.

Voir Joel, son essai sur Rendre le Code Regarde Mal pour de l'aide

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X