Почему DomSanitizer не работает для строкового значения?

Цель: отправить строковую переменную из приложения Angular (typesript) в iFrame, находящийся на другом сервере, чтобы ее можно было использовать в условном выражении.

Вопрос: как использовать DomSanitizer конкретно для переменной?

Типы состояний документации: HTML, Style, Script, Url. Что, если я просто хочу отправить обычную строковую переменную? Документация не ясна по этому поводу.

SecurityContext показывает тот же https://angular.io/api/core/SecurityContext . Скрипт пробовал. Я также пробовал метод санации, но для этого нужен контекст безопасности.

Я пытался использовать сценарий, но получаю сообщение об ошибке: Ошибка: небезопасное значение используется в контексте URL-адреса ресурса (см. http://g.co/ng/security#xss) в DomSanitizerImpl.push../node_modules/@angular/platform-browser/fesm5/platform-browser.js.DomSanitizerImpl.sanitize

Я прочитал (http://g.co/ng/security#xss) и (https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage#Security_concerns), а также другие статьи о domsanitizer, postmessage, жизненных циклах Angular и т. д. Я пробовал размещать код в разных областях файла, включая onload и т. д.

чат.component.html:

<div class="iframe-container"> 
    <iframe id="iframe_chatui" src="{{ chatURL }}/loading.html" class="chatiframe" allow="microphone; camera"></iframe>
</div>

чат.component.ts:

ngAfterViewInit() {        
        this.safeScript = this.domSanitizer.bypassSecurityTrustScript(this.localeId);
        let frame = document.getElementById('iframe_chatui');           
    }

когда я добавляю следующее, я получаю сообщение об ошибке: Невозможно прочитать свойство 'contentWindow' из null

let frame = document.getElementById('iframe_chatui') as HTMLIFrameElement;       
frame.contentWindow.postMessage(this.localeId, '*');

person angleUr    schedule 13.06.2019    source источник
comment
Зачем вам дезинфицировать строку? Это не имеет смысла. Строка есть строка.   -  person Roberto Zvjerković    schedule 13.06.2019
comment
Потому что я получаю ошибку XSS, которая указывает на документацию, которая говорит мне о ее очистке. Как мне не получить ошибку, если я не продезинфицирую?   -  person angleUr    schedule 13.06.2019
comment
Вы должны дезинфицировать URL-адрес. const toSanitize = chatURL+"/loading.html"   -  person Roberto Zvjerković    schedule 13.06.2019
comment
Спасибо! Извините, я не думаю, что понимаю, зачем дезинфицировать URL-адрес, когда это значение, которое я хочу передать, однако я только что применил то, что вы сказали, но я все еще не могу отправить сообщение в iframe. Независимо от того, где я его размещаю, я получаю: Невозможно прочитать свойство 'contentWindow' из null   -  person angleUr    schedule 13.06.2019


Ответы (1)


Попробуйте обойти защиту angular с помощью bypassSecurityTrustResourceUrl. Затем используйте это значение из функции для вызова iframe.

Но будьте очень осторожны, вы обходите встроенный механизм безопасности angular. Если вы доверяете URL-адресу и убедитесь, что он исходит только из вашего источника, вы можете использовать эту функцию.

Вот ссылка на документацию по angular: https://angular.io/api/platform-browser/DomSanitizer#bypassSecurityTrustResourceUrl

Я рекомендую прочитать об URL-атаках, которые могут произойти на веб-сайте owasp. Убедитесь, что ваш URL соответствует регулярному выражению, указанному в следующей ссылке: https://www.owasp.org/index.php/OWASP_Validation_Regex_Repository

person ronakvp    schedule 30.08.2019