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).
так почему он говорит это? Что может быть опасным 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="<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>
это затем получает вывод как
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>