Maison >développement back-end >tutoriel php >Attaques de scripts croisés (XSS)

Attaques de scripts croisés (XSS)

William Shakespeare
William Shakespeareoriginal
2025-02-27 09:12:10528parcourir

Cross-Site Scripting Attacks (XSS)

Points clés

  • L'attaque de script inter-sites (XSS) est une attaque d'injection de code courante qui se produit en raison de la vérification inappropriée des données des utilisateurs (insérant ou manipulant généralement les hyperliens via des formulaires Web). Cela peut permettre d'enregistrer le code client nuisible sur le serveur ou exécuté dans le navigateur de l'utilisateur.
  • Les attaques XSS peuvent être divisées en deux types: XSS non persistants (le code malveillant est passé par le serveur et présenté à la victime) et les XSS persistants (code de code nuisible de la vérification et sont stockés dans la boutique de données du site Web et exécuté lorsque les informations s'affichent sur le site Web).
  • Empêcher les attaques XSS nécessite de ne jamais faire confiance aux données des utilisateurs ou de sources tierces, de vérifier toutes les données à l'entrée et de les échapper lors de la sortie. Cela comprend la mise en œuvre de la vérification des données, du nettoyage des données et des mesures d'échappement de sortie.
  • Bien que de nombreux cadres PHP fournissent des mesures de sécurité intégrées, il est essentiel de tester en continu le code de validation avec les derniers vecteurs de test XSS pour s'assurer que le code n'est pas affecté par les attaques XSS.

Les attaques de scripts inter-sites sont l'une des cinq principales attaques de sécurité qui se produisent chaque jour sur Internet, et vos scripts PHP peuvent ne pas être épargnés. Cette attaque, également connue sous le nom de XSS, est essentiellement une attaque d'injection de code qui est possible en raison d'une vérification incorrecte des données utilisateur, qui est généralement insérée dans une page via un formulaire Web ou à l'aide d'un hyperlien changé. Le code injecté peut être n'importe quel code client malveillant, tel que JavaScript, VBScript, HTML, CSS, Flash, etc. Ce code est utilisé pour enregistrer des données nuisibles sur le serveur ou effectuer des actions malveillantes dans le navigateur de l'utilisateur. Malheureusement, les attaques de scripts croisées se produisent principalement parce que les développeurs ne fournissent pas de code sécurisé. Il est de la responsabilité de chaque programmeur PHP de comprendre comment attaquer ses scripts PHP pour exploiter d'éventuelles vulnérabilités de sécurité. Lisez cet article et vous en apprendrez plus sur les attaques de scripts croisés et comment les empêcher dans votre code.

Apprenez à travers des exemples

Regardons l'extrait de code suivant.

<code class="language-php"><form action="post.php" method="post">
  <input type="text" name="comment" value="">
  <input type="submit" name="submit" value="Submit">
</form></code>

Ici, nous avons un formulaire simple avec une zone de texte pour la saisie de données et un bouton de soumission. Après avoir soumis le formulaire, il soumet les données à post.php pour le traitement. Supposons que POST.php n'étend que des données, comme indiqué ci-dessous:

<code class="language-php"><?php echo $_POST["comment"]; ?></code>

sans aucun filtrage, le pirate peut soumettre ce qui suit par le formulaire, qui générera une fenêtre contextuelle dans le navigateur avec le message "piraté".

<code class="language-javascript">alert("hacked")</code>

Cet exemple, bien que malveillant, ne semble pas causer beaucoup de mal. Mais pensez à ce qui se passe si le code JavaScript est écrit pour voler les cookies de l'utilisateur et en extraire des informations sensibles? Il y a des attaques XSS pires que les appels Alert () simples.

Les attaques de scripts croisées peuvent être divisées en deux catégories en fonction de la façon dont ils offrent des charges utiles malveillantes: XSS non persistants et XSS persistants. Veuillez me permettre de discuter de chaque type en détail.

XSS non persistant

Également connu comme une attaque XSS réfléchissante, cela signifie que le code malveillant n'est pas réellement stocké sur le serveur, mais est passé et présenté à la victime, qui est la stratégie XSS la plus populaire parmi les deux méthodes de livraison. Les attaques sont initiées à partir de sources externes, telles que des e-mails ou des sites Web tiers. Voici une partie d'un simple script de résultat de recherche:

<code class="language-php"><form action="post.php" method="post">
  <input type="text" name="comment" value="">
  <input type="submit" name="submit" value="Submit">
</form></code>

Cet exemple peut être une page de résultat très dangereuse où la requête de recherche sera affichée à l'utilisateur. Le problème ici est que la variable $_GET["query"] n'est pas vérifiée ou échappée, afin que l'attaquant puisse envoyer le lien suivant à la victime:

<code class="language-php"><?php echo $_POST["comment"]; ?></code>

Aucune vérification n'est requise, la page contiendra:

<code class="language-javascript">alert("hacked")</code>

permanence XSS

Ce type d'attaque se produit lorsque le code malveillant a passé le processus de vérification et est stocké dans le magasin de données. Il peut s'agir d'un commentaire, d'un fichier journal, d'un message de notification ou de toute autre partie du site Web qui nécessite une entrée utilisateur. Plus tard, lorsque ces informations spécifiques sont affichées sur le site Web, le code malveillant s'exécute. Utilisons l'exemple suivant pour créer un système de commentaires basé sur des fichiers de base. En supposant le même formulaire que j'ai introduit plus tôt, en supposant que le script de réception ajoute simplement les commentaires au fichier de données.

<code class="language-php"><?php // 根据查询获取搜索结果
echo "You searched for: " . $_GET["query"];

// 列出搜索结果
...</code>

Autres endroits, le contenu des commentaires.txt s'affiche au visiteur:

<code>http://example.com/search.php?query=alert("hacked")</code>

Lorsqu'un utilisateur soumet un commentaire, il est enregistré dans le fichier de données. L'ensemble du fichier (et donc l'intégralité de la série de commentaires) sera ensuite affiché au lecteur. Si le code malveillant est soumis, il sera enregistré et affiché tel quel sans validation ni évasion.

Empêchez les attaques de scripts inter-sites

Heureusement, c'est aussi facile que les attaques XSS sur des sites non protégés, et c'est tout aussi facile de les empêcher. Cependant, la prévention doit toujours être gardée à l'esprit avant même d'écrire une ligne de code. La première règle selon laquelle tout environnement Web (que ce soit le développement, la mise en scène ou la production) doit être "appliqué" est de ne jamais faire confiance aux données des utilisateurs ou de toute autre source tierce. Cela ne peut pas être trop souligné. Chaque bit d'entrée de données doit être vérifiée et échappée à la sortie. Il s'agit de la règle d'or pour empêcher les XS. Pour mettre en œuvre des mesures de sécurité fiables pour empêcher les attaques XSS, nous devons prêter attention à la vérification des données, au nettoyage des données et à l'échappement des sorties.

Vérification des données

La vérification des données est le processus de garantie que l'application s'exécute avec les données correctes. Si votre script PHP s'attend à ce que l'utilisateur entre un entier, tout autre type de données sera rejeté. Chaque pièce de données utilisateur reçue doit être vérifiée pour s'assurer que son type est correct et rejeté en cas d'échec du processus de vérification. Par exemple, si vous souhaitez vérifier un numéro de téléphone, vous jeterez toute chaîne contenant les lettres, car le numéro de téléphone ne doit contenir que des numéros. Vous devez également considérer la longueur de la chaîne. Si vous voulez être un peu plus lâche, vous pouvez autoriser un ensemble limité de caractères spéciaux, tels que des panneaux plus, des supports et des tirets, qui sont souvent utilisés pour formater les numéros de téléphone spécifiques à votre paramètre cible.

<code class="language-php"><form action="post.php" method="post">
  <input type="text" name="comment" value="">
  <input type="submit" name="submit" value="Submit">
</form></code>

Nettoyage des données

Le nettoyage des données se concentre sur la manipulation des données pour s'assurer qu'elle est sûre en supprimant les bits indésirables des données et en les normalisant sous la forme correcte. Par exemple, si vous vous attendez à des chaînes de texte brut comme entrée utilisateur, vous pouvez en supprimer toutes les balises HTML.

<code class="language-php"><?php echo $_POST["comment"]; ?></code>

Parfois, la vérification des données et le nettoyage / normalisation peuvent être effectués simultanément.

<code class="language-javascript">alert("hacked")</code>

Escape de sortie

Pour protéger l'intégrité des données d'affichage / sortie, vous devez échapper aux données lorsqu'elle est présentée à l'utilisateur. Cela empêche le navigateur d'appliquer toute signification inattendue à toute séquence de caractères spéciale qui peut être trouvée.

<code class="language-php"><?php // 根据查询获取搜索结果
echo "You searched for: " . $_GET["query"];

// 列出搜索结果
...</code>

ensemble maintenant!

Pour mieux comprendre les trois aspects du traitement des données, examinons à nouveau le système de commentaires basé sur des fichiers précédents et modifions-le pour assurer sa sécurité. La vulnérabilité potentielle du code découle du fait que $_POST["comment"] est attaché aveuglément au fichier comment.txt puis affiché directement à l'utilisateur. Pour s'assurer qu'il est sûr, la valeur $_POST["comment"] doit être vérifiée et nettoyée avant de l'ajouter au fichier, et elle doit être échappée lorsque le contenu du fichier est affiché à l'utilisateur.

<code>http://example.com/search.php?query=alert("hacked")</code>

Le script vérifie d'abord les commentaires entrants pour s'assurer que l'utilisateur a fourni une chaîne non nul. Après tout, les commentaires vides ne sont pas très intéressants. La validation des données doit être effectuée dans un contexte bien défini, ce qui signifie que si je m'attends à obtenir un entier de l'utilisateur, je les valide en conséquence en convertissant les données en un entier et en le traitant en entier. Si cela se traduit par des données non valides, jetez-les simplement et faites-le savoir à l'utilisateur. Le script nettoie ensuite les commentaires en supprimant les balises HTML qui peuvent être incluses. Enfin, récupérez, filtrez et affichez les commentaires. En règle générale, la fonction htmlspecialchars() est suffisante pour filtrer la sortie destinée à être affichée dans le navigateur. Cependant, si le codage de caractère que vous utilisez dans une page Web n'est pas ISO-8859-1 ou UTF-8, vous devrez peut-être utiliser htmlentities(). Pour plus d'informations sur ces deux fonctions, lisez les descriptions respectives dans la documentation officielle PHP. N'oubliez pas qu'il n'y a pas de solution unique à 100% sur un support en évolution comme le Web. Testez soigneusement votre code de vérification avec les derniers vecteurs de test XSS. L'utilisation des données de test des sources suivantes devrait révéler si votre code est toujours vulnérable aux attaques XSS.

  • RSNAKE XSS Cheatheet (une liste assez complète de vecteurs XSS que vous pouvez utiliser pour tester votre code)
  • Données de test XSS de Zend Framework
  • XSS CheatSheet (en utilisant des fonctionnalités HTML5)

Résumé

J'espère que cet article vous explique très bien quelles sont les attaques de scripts inter-sites et comment les empêcher de se produire dans votre code. Ne faites jamais confiance aux données des utilisateurs ou de toute autre source tierce. Vous pouvez vous protéger en validant les valeurs entrantes dans un contexte bien défini, en nettoyant les données pour protéger votre code et en échappant à la sortie pour protéger vos utilisateurs. Après avoir écrit le code, assurez-vous de travailler correctement en testant le code aussi bien que possible.

(image d'Inters Schepers / Shutterstock)

Si vous aimez ce post, vous aimerez l'apprentissage; Les membres peuvent accéder instantanément à tous les livres électroniques de SitePoint et aux cours en ligne interactifs, tels que Jump Start PHP.

Les commentaires de cet article ont été fermés. Vous avez des questions sur PHP? Pourquoi ne pas poser de questions sur notre forum?

FAQS (FAQ) sur la sécurité PHP et les attaques de scripts croisés (XSS)

Quel est l'impact des attaques de scripts croisés (XSS) sur les applications PHP?

Les attaques de scripts croisés (XSS) peuvent avoir un impact significatif sur les applications PHP. Ils peuvent conduire à un vol de données, à un détournement de session, à la corruption du site Web et même à la distribution de code malveillant aux utilisateurs. XSS attaque les vulnérabilités d'exploits dans les applications Web pour injecter des scripts malveillants, puis les exécuter par le navigateur de l'utilisateur. Cela peut compromettre l'interaction utilisateur avec l'application et peut divulguer des informations sensibles.

Comment identifier les vulnérabilités potentielles XSS dans mon application PHP?

Identifier les vulnérabilités potentielles XSS dans les applications PHP nécessite une combinaison de révision manuelle du code et de tests automatisés. Trouvez des zones dans le code où l'entrée de l'utilisateur est directement incluse dans la sortie sans nettoyage ou vérification appropriée. Les outils d'automatisation comme les scanners XSS peuvent également aider à identifier les vulnérabilités potentielles en testant divers vecteurs d'attaque XSS.

Quelles sont les méthodes courantes utilisées dans les attaques XSS?

Les attaques XSS impliquent généralement l'injection de scripts malveillants dans les pages Web visualisées par d'autres utilisateurs. Cela peut être fait de diverses manières, tels que l'intégration de scripts dans les paramètres d'URL, les entrées de formulaire et même les cookies. Le script malveillant peut alors effectuer des actions au nom de l'utilisateur, comme le vol de cookies de session ou la manipulation du contenu de la page Web.

Comment empêcher les attaques XSS dans mon application PHP?

Empêcher les attaques XSS dans des applications PHP implique la validation et le nettoyage de l'entrée de l'utilisateur, la sortie codée et l'utilisation des en-têtes HTTP appropriés. Traitez toujours l'entrée de l'utilisateur comme non fiable et validez-le par rapport à la liste admissible des valeurs acceptables. Nettoyez l'entrée pour supprimer tous les caractères ou code qui peuvent être nocifs. La sortie est encodée pour garantir que tous les caractères pouvant être nocifs deviennent inoffensifs. Utilisez des en-têtes HTTP tels que les politiques de sécurité de contenu pour limiter la source des scripts et autres ressources.

Quel rôle joue les politiques de sécurité du contenu dans la prévention des attaques XSS?

Les en-têtes HTTP de la politique de sécurité du contenu (CSP) jouent un rôle crucial dans la prévention des attaques XSS. Il vous permet de spécifier un domaine que le navigateur doit considérer comme une source valide de scripts exécutables. Cela signifie que même si un attaquant peut injecter un script dans votre page Web, le navigateur ne l'exécutera pas à moins que la source du script ne soit sur la liste blanche dans votre CSP.

Quelle est la différence entre une attaque XSS de stockage et une attaque XSS réfléchissante?

Les attaques XSS de stockage impliquent l'injection de scripts malveillants qui sont stockés en permanence sur le serveur cible. Ensuite, lorsque l'utilisateur considère certaines pages, le script est fourni à l'utilisateur. Les attaques XSS réfléchissantes, en revanche, impliquent l'injection d'un script via une entrée d'URL ou de formulaire, que le serveur renvoie immédiatement dans la réponse et exécute par le navigateur de l'utilisateur.

Comment utiliser les fonctions intégrées de PHP pour empêcher les attaques XSS?

PHP fournit certaines fonctions intégrées qui peuvent aider à prévenir les attaques XSS. Par exemple, la fonction htmlspecialchars() peut être utilisée pour coder des caractères spéciaux dans l'entrée de l'utilisateur, ce qui rend les scripts potentiels inoffensifs. Les fonctions filter_input() peuvent être utilisées pour nettoyer l'entrée des utilisateurs, supprimer ou coder des caractères nocifs.

Quel rôle joue les cookies httponly pour prévenir les attaques XSS?

Httponly Cookie est un cookie qui ne peut pas être accessible via les scripts des clients. Cela signifie que même si un attaquant peut injecter un script dans votre page Web, il ne peut pas utiliser le script pour lire ou modifier des cookies httponly. Cela peut aider à protéger les informations sensibles (telles que les identifiants de session) contre le volé par des attaques XSS.

Les attaques XSS peuvent-elles être utilisées pour contourner la protection du CSRF?

Oui, les attaques XSS peuvent être utilisées pour contourner la protection contre la contrefaçon des demandes (CSRF). Si un attaquant peut injecter un script dans votre page Web, il peut l'utiliser pour effectuer des actions au nom de l'utilisateur, en contournant potentiellement toutes les protections CSRF que vous avez implémentées. C'est pourquoi il est important de se protéger contre les attaques XSS et CSRF.

Quels frameworks PHP offrent une protection intégrée contre les attaques XSS?

Oui, de nombreux cadres PHP offrent une protection intégrée contre les attaques XSS. Par exemple, Laravel code automatiquement la sortie pour empêcher les attaques XSS. D'autres cadres tels que Symfony et Codeigniter fournissent également des fonctionnalités pour nettoyer l'entrée des utilisateurs et la sortie codée. Cependant, il faut se rappeler qu'aucun cadre ne peut offrir une protection complète et vous devez toujours suivre les meilleures pratiques pour prévenir les attaques XSS.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn