(ПРОПУЩЕНО:

ЗАПИСЬ В БЛОГЕ: https://javascriptlearner815.github.io/blog/2021/03/28/stop-using-innerHTML-with-user-input.html

Почему?

Безопасность.

Допустим, у вас есть навигационная система на основе ввода, например:

index.html:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Bob's Books</title>
    <link rel="stylesheet" href="main.css">
    <script defer src="script.js"></script>
  </head>
  <body>
    <header>
      <h1>Bob's Books</h1>
    </header>
    <hr>
    <main>
      <div id="default">
        <p><i>Where would you like to go?</i></p>
        <input id="location" type="text" placeholder="Where would you like to go?">
        <button id="go">Go!</button>
      </div>
      <div id="result" hidden>
        <!-- ... -->
        <!-- Elements with spans for things like name, image, etc. that have IDs handled in script -->
      </div>
    </main>
    <hr>
    <footer>
      This Project Is Under The MIT License.
    </footer>
  </body>
</html>

main.css:

*, *::before, *::after {
  box-sizing: border-box;
}
body {
  font-family: Arial, Helvetica, sans-serif;
}
/* ... */

script.js:

// ...
// <span>.innerHTML = <requestedLocation>;

Вот это было бы здорово, правда? … Не так много.

Если злоумышленник хотел выполнить скрипты, работающие с базами данных, импортирующие скрипты и т. д., он вводил что-то вроде этого:

<script>function goodbyeBob(){/*...*/}</script><img src onerror="goodbyeBob()"/>

И, поскольку innerHTML позволяет HTML, весь этот вредоносный код JavaScript будет выполняться от души.

Как исправить

Измените все ссылки на innerHTML с пользовательского ввода на innerText. Если вы хотите, чтобы НЕКОТОРЫЕ функции HTML могли быть введены пользователем и выполнены (предпочтительно отфильтрованы), используйте .replace(), if ... else, защитные предложения и т. д.