J'utilise <div [innerHTML]="body"></div>
pour passer du code HTML non échappé à mon modèle, et lorsque je passe à body
div
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 ).
Alors pourquoi ça dit ça? Qu'est-ce qui peut être dangereux id
dans div
? Pourrait ce bug?
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="<script>alert('xss')</script>" />
<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.
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>
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.