Angular 2: дезинфекция HTML лишила некоторый контент с div id - это ошибка или функция?

Я использую <div [innerHTML]="body"></div> чтобы передать unescaped HTML в мой шаблон, и когда я перейду к body div С атрибутом id, углового броска:

предупреждение: дезинфекция HTML очистила некоторый контент (см. http://g.co/ng/security#xss). Предупреждение: очистка HTML-кода от содержимого (см. http://g.co/ng/security#xss). Предупреждение: очистка HTML-кода от содержимого (см. http://g.co/ng/security#xss).

посмотреть. plunker

так почему он говорит это? Что может быть опасным id на div? Мог ли этот жук?

2 ответов


это потому, что атрибут id небезопасен.

это не мой ответ, но он ответит на ваш вопрос: https://security.stackexchange.com/questions/88973/why-do-id-attributes-need-stricter-validation


на id и name, эти атрибуты часто используются в качестве опорных точек в дом.

если злоумышленник может подделать эти опорные точки, она может обмануть существующие сценарии в получении и установка значений из мест, отличных от разработанных, что может быть опасно в зависимости от контекста, который используется.


Примечание от меня: остальная часть его сообщения говорит об атрибуте имени, но вы получите идею за всем этим, если вы уже не тем, что выше


это также относится к HTML-формам, где name используется для идентификации пары имя/значение. Например, если веб-сайт не кодирует определенное поле формы, когда оно вывод, но поскольку поле формы генерируется сервером и форма защищена от CSRF с помощью токенов, его нельзя использовать обычными средствами. Однако злоумышленник может соблазнить пользователя посетить URL-адрес с параметром, который используется в name, содержащий полезную нагрузку XSS для выполнения при отправке формы.

например, нормальное использование:

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

который представляет собой форму

<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>

а затем получает вывод as

Thank you for buying from Bob's Supplies.

однако злоумышленник может отправить ссылку пользователю следующим образом:

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

поскольку приложение правильно кодирует HTML на данный момент, оно отображает форму как

<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>

это затем получает вывод как

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

так как эта страница не кодирует HTML shop_name параметр, потому что он является доверенным, и платформа приложений всегда принимает первое значение в случае дубликатов. Очень надуманно, но это было первое, что мне пришло в голову продемонстрировать это.


простое решение-написать трубу, как

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);
  }
}

добавить в html-файл добавить кучу, как

  <td *ngIf="i>0" [innerHTML]="entry.attributes[i] | sanitizeHtml"></td>