.innerHTML Cross-Site-Scripting

.innerHTML??

.innerHTML ist ein JavaScript-Tag, dessen Eigenschaft für die DOM-Manipulation verwendet wird. Genauer gesagt, es "setzt oder gibt den HTML-Inhalt (das innere HTML) eines Elements zurück." (1)

const item = document.getElementById("exampleIdName").innerHTML = "Something had changed!";

Normalerweise wird diese Eigenschaft verwendet, um den aktuellen HTML-Quellcode der Seite zu untersuchen, einschließlich aller Änderungen, die seit dem ersten Laden der Seite vorgenommen wurden. Es kann aber auch für Cross-Site-Scripting (XSS) verwendet werden.

Cross-Site-Scripting (XSS)

XSS ist eine Angriffsart, bei der bösartige Skripte in ansonsten vertrauenswürdige Websites eingeschleust werden. "XSS-Angriffe treten auf, wenn ein Angreifer eine Webanwendung verwendet, um bösartigen Code, im Allgemeinen in Form eines browserseitigen Skripts, an einen anderen Endbenutzer zu senden." (2)
Wenn der Angreifer XSS verwendet, um ein bösartiges Skript an einen ahnungslosen Benutzer zu senden, hat der Browser des Endbenutzers keine Möglichkeit zu wissen, dass dem Skript nicht vertraut werden sollte, und führt das Skript aus. „Da das bösartige Skript davon ausgeht, dass das Skript von einer vertrauenswürdigen Quelle stammt, kann es auf alle Cookies, Sitzungstoken oder andere vertrauliche Informationen zugreifen, die vom Browser gespeichert und mit dieser Website verwendet werden. Darüber hinaus können diese Skripte sogar den Inhalt der HTML-Seite umschreiben ." (2)

.innerHTML und Sicherheit

Die Verwendung von .innerHTML ist immer noch eine ziemlich gängige Praxis zum Bearbeiten von Elementen auf einer Webseite, da Sie durch Festlegen des Werts von .innerHTML den vorhandenen Inhalt eines Elements einfach durch neuen Inhalt ersetzen können. (3) Aufgrund der Art und Weise, wie .innerHTML Text und Elemente zu einer Webseite hinzufügen kann, kann es jedoch leicht manipuliert werden, um potenziell unerwünschte oder schädliche Elemente innerhalb anderer HTML-Element-Tags anzuzeigen. Leider sind die „Fehler“, die es ermöglichen, dass XSS-Angriffe über .innerHTML erfolgreich sind, ziemlich weit verbreitet und treten überall dort auf, wo eine Webanwendung Eingaben von einem Benutzer verwendet.

item.innerHTML = name;     // harmless in this case
// ...
name = "<script>alert('I am John in an annoying alert!')</script>";
item.innerHTML = name;     // harmless in this case
---
const name = "<img src='x' onerror='alert(1)'>";
el.innerHTML = name; // shows the alert

XSS über .innerHTML verhindern


Die OWASP-Organisation gibt einige Regeln heraus, die beim Verhindern von XSS helfen können (5), aber die Regeln erlauben keine absolute Freiheit beim Einfügen nicht vertrauenswürdiger Daten in ein HTML-Dokument.
Die Regeln sollten die überwiegende Mehrheit der gängigen Anwendungsfälle abdecken, aber es gibt einen integrierten Schutz in Browsern, da das einfache Einfügen eines Skriptelements Sie keinen Angriffen aussetzt, da dieser Abschnitt des DOM bereits analysiert und ausgeführt wurde.

Der beste Weg, .innerHTML-XSS zu verhindern, besteht darin, Benutzereingaben zu validieren oder zu codieren und, wenn möglich, innerText anstelle von .innerHTML zu verwenden. Außerdem:„Wenn Ihr Projekt einer Sicherheitsüberprüfung unterzogen wird, führt die Verwendung von innerHTML höchstwahrscheinlich dazu, dass Ihr Code abgelehnt wird. Zum Beispiel, wenn Sie innerHTML in einer Browsererweiterung verwenden und die Erweiterung an addons.mozilla.org senden , wird es den automatischen Überprüfungsprozess nicht bestehen." (3)

Ist es sicher zu verwenden?

Die "Sicherheit" der .innerHTML-Eigenschaft ist umstritten und hängt von ihrer Verwendung ab. Es ist ein Sicherheitsproblem, wenn es vom Benutzer bereitgestellte Werte einfügt, aber wenn Sie es verwenden, um statische Daten oder etwas, das ohne Eingaben des Benutzers generiert wird, einzufügen, ist es kein Sicherheitsproblem.
Um die Sicherheit bestmöglich zu gewährleisten, empfiehlt es sich immer, alle Benutzerdaten auf einer Seite zu verschlüsseln oder zu "bereinigen".

Ressourcen

  1. https://www.w3schools.com/jsref/prop_html_innerhtml.asp
  2. https://www.owasp.org/index.php/Cross-site_Scripting_(XSS)
  3. https://developer.mozilla.org/en-US/docs/Web/API/Element/innerHTML
  4. https://www.youtube.com/watch?v=1UsllDMhvN4
  5. https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Cross_Site_Scripting_Prevention_Cheat_Sheet.md
Bitte beachten Sie, dass ich Student bin und noch lerne. Wenn etwas, das ich angegeben habe, falsch ist, lassen Sie es mich bitte wissen. Ich würde gerne mehr darüber erfahren, was ich vielleicht nicht ganz verstehe.