web-dev-qa-db-fra.com

Angular 2: la désinfection du HTML a supprimé du contenu avec div id - c'est un bug ou une fonctionnalité?

J'utilise <div [innerHTML]="body"></div> pour passer du code HTML non échappé à mon modèle, et lorsque je passe à bodydiv avec l'attribut id, Angular throw:

AVERTISSEMENT: la désinfection du HTML a supprimé certains contenus (voir http://g.co/ng/security#xss ). AVERTISSEMENT: la désinfection du HTML a supprimé certains contenus (voir http://g.co/ng/security#xss ). AVERTISSEMENT: la désinfection du HTML a supprimé certains contenus (voir http://g.co/ng/security#xss ).

Voir. Plunker

Alors pourquoi ça dit ça? Qu'est-ce qui peut être dangereux id dans div? Pourrait ce bug?

22
ktretyak

C'est parce que l'attribut id n'est pas sûr.

Ce n'est pas ma réponse mais cela répondra à votre question: https://security.stackexchange.com/questions/88973/why-do-id-attributes-need-stricter-validation


Pour id et name, ces attributs sont fréquemment utilisés comme points de référence dans le DOM.

Si un attaquant peut usurper ces points de référence, il peut être en mesure de tromper les scripts existants pour obtenir et définir des valeurs à partir d'endroits autres que ceux conçus, ce qui peut être dangereux selon le contexte utilisé .


Note de moi: le reste de son article parle de l'attribut name, mais vous aurez l'idée derrière tout cela si vous ne l'avez pas déjà par ce qui est au-dessus


Cela s'applique également aux formulaires HTML où name est utilisé pour identifier la paire nom/valeur. Par exemple, si un site Web n'encode pas un champ de formulaire particulier lors de sa sortie, mais comme le champ de formulaire est généré par le serveur et que le formulaire est protégé contre CSRF par l'utilisation de jetons, il ne peut pas être exploité par des moyens normaux. Cependant, un attaquant peut être en mesure d'inciter un utilisateur à visiter une URL avec un paramètre utilisé dans name, contenant une charge utile XSS à exécuter lors de la soumission du formulaire.

par exemple. Utilisation normale:

https://example.com/product?item_name=watch&qty=1

qui rend une forme

<form>

<input type="hidden" name="watch" value="1" />
<input type="hidden" name="shop_name" value="Bob's Supplies" />
<input type="hidden" name="anti-csrf" value="asdjasodhoai" />

<input type="submit" value="Click here to buy" />

</form>

Et puis obtient la sortie en tant que

Thank you for buying from Bob's Supplies.

Cependant, un attaquant pourrait envoyer un lien à l'utilisateur comme ceci:

https://example.com/product?item_name=shop_name&qty=<script>alert('xss')</script>

Comme l'application est correctement encodée en HTML à ce stade, elle rend le formulaire

<form>

<input type="hidden" name="shop_name" value="&lt;script&gt;alert(&#039;xss&#039;)&lt;/script&gt;" />
<input type="hidden" name="shop_name" value="Bob's Supplies" />
<input type="hidden" name="anti-csrf" value="asdjasodhoai" />

<input type="submit" value="Click here to buy" />

</form>

Cela obtient ensuite la sortie en tant que

Thank you for buying from <script>alert('xss')</script>.

puisque cette page n'encode pas HTML le shop_name paramètre car il est fiable et le cadre d'application prend toujours la première valeur en cas de doublons. Très artificiel, mais c'était la première chose qui m'est venue à l'esprit pour démontrer le point.

7
Ced

Une solution simple consiste à écrire un tuyau comme

import { Pipe, PipeTransform } from "@angular/core";
import { DomSanitizer, SafeHtml } from '@angular/platform-browser';

@Pipe({
  name: 'sanitizeHtml'
})
export class SanitizeHtmlPipe implements PipeTransform {

  constructor(private _sanitizer:DomSanitizer) {
  }

  transform(v:string):SafeHtml {
    return this._sanitizer.bypassSecurityTrustHtml(v);
  }
}

ajouter dans votre fichier html ajouter une pile comme

  <td *ngIf="i>0" [innerHTML]="entry.attributes[i] | sanitizeHtml"></td>
53
Md Ayub Ali Sarker

Vous pouvez également utiliser la bibliothèque NgDompurify . Il peut mieux nettoyer votre contenu grâce à DomPurify et résout tous vos problèmes avec angular sanitizer par défaut.

0
marsibarsi