Что происходит со скриптами внутри интерполяции Angular?

У меня есть переменная test = '<script>alert()</script>'. Я поместил эту переменную в компонент Angular, используя интерполяцию <div>{{ this.test }}</div>. Затем он просто отображался как обычный текст на странице, например: <script>alert("test")</script>

Вопросы:

  1. Почему значение не очищается Angular? (например, для [innerHtml] будут удалены теги «script»). Из документов Angular: «Когда значение вставляется в DOM из привязки шаблона или интерполяции, Angular очищает и избегает ненадежных значений».
  2. Если значение не очищено - почему приложение не запускает скрипт?
{{ this.test }} всегда возвращает текст, а не код HTML.
jabaa 20.07.2023 23:18

Спасибо, но как браузер понимает, что он не должен интерпретировать обычный текст как HTML, если он имеет правильные теги html? Как отличить одно от другого? (теги, кажется, не закодированы)

Carl 21.07.2023 08:48
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
2
50
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Angular автоматически очищает значения, чтобы предотвратить межсайтовый скриптинг. Это удалит небезопасный код.

В некоторых сценариях может потребоваться отключить очистку. Для этих случаев использования Angular предоставляет сервис DomSanitizer, который вы можете использовать для отключения дезинфекции. Обязательно ознакомьтесь с XSS и потенциальными рисками, прежде чем использовать этот сервис.

Да, это правильно, и поэтому я не понимаю, почему это не очищает значение, когда мы используем интерполяцию.

Carl 21.07.2023 08:08
Ответ принят как подходящий

Две вещи здесь Interpoaltion и InnerHtml.

Интерполяцию можно использовать только для отображения простого текстового содержимого, а не HTML.

Пример: <p>Hello, {{ name }}!</p>

Вы должны использовать [innerHtml] только в том случае, если вы доверяете источнику контента или должным образом очистили данные с помощью службы DomSanitizer для предотвращения XSS-атак.

Пример: <div [innerHtml] = "htmlContent"></div>

В вашем случае, когда вы используете интерполяцию {{ this.test }} для отображения переменной, Angular обрабатывает значение как обычный текст и не выполняет никакой автоматической очистки, в результате чего теги <script> отображаются на странице как обычный текст.

С другой стороны, когда вы используете привязку [innerHtml], Angular обрабатывает значение как содержимое HTML и автоматически очищает его с помощью службы DomSanitizer, чтобы предотвратить любые вредоносные сценарии или потенциальные угрозы безопасности. Вот почему теги <script> удаляются при использовании [innerHtml].

Если вы хотите отобразить содержимое переменной в виде HTML с надлежащей очисткой, вам следует использовать привязку [innerHtml] и очистить значение с помощью службы DomSanitizer. Вот пример того, как вы можете сделать это в своем компоненте:

import { Component, OnInit } from '@angular/core';
import { DomSanitizer, SafeHtml } from '@angular/platform-browser';

@Component({
  selector: 'app-your-component',
  template: '<div [innerHtml] = "sanitizedTest"></div>'
})
export class YourComponent implements OnInit {
  test = '<script>alert("test")</script>';
  sanitizedTest: SafeHtml;

  constructor(private sanitizer: DomSanitizer) { }

  ngOnInit() {
    // Sanitize the value before binding it to the template
    this.sanitizedTest = this.sanitizer.bypassSecurityTrustHtml(this.test);
  }
}

Спасибо за подробный ответ! Но как браузер понимает, что <script>alert("test")</script> из интерполяции является обычным текстом и не должен отображаться как html?

Carl 21.07.2023 09:09

Angular автоматически очистит значение свойства и отобразит его как обычный текст в представлении &lt;script&gt;alert("test")&lt;/script&gt; , теги <script> экранируются как &lt; и &gt;, что предотвращает их интерпретацию как теги HTML и выполнение как скрипты.

yashaswi kakumanu 21.07.2023 10:20

Теперь понял, спасибо!

Carl 21.07.2023 10:38

Другие вопросы по теме