Blanks Blog: http://www.planabc.net/ Die Verwendung der innerHTML-Eigenschaft ist sehr beliebt, da sie eine einfache Möglichkeit bietet, den Inhalt eines HTML-Elements vollständig zu ersetzen. Ein anderer Ansatz ist die Verwendung der DOM Level 2-API (removeChild, createElement, appendChild). Es ist jedoch offensichtlich, dass die Verwendung von innerHTML zum Ändern des DOM-Baums eine sehr einfache und effektive Methode ist. Sie müssen sich jedoch darüber im Klaren sein, dass innerHTML einige eigene Probleme mit sich bringt:
Es gibt noch ein paar weitere kleinere Nachteile, die erwähnenswert sind:
Ich mache mir mehr Sorgen über die Sicherheits- und Speicherprobleme, die mit der Verwendung der innerHTML-Eigenschaft verbunden sind. Offensichtlich handelt es sich hierbei nicht um neue Probleme und es gibt bereits kluge Leute, die Wege gefunden haben, einige dieser Probleme zu umgehen. Douglas Crockford hat eine Bereinigungsfunktion geschrieben, die dafür verantwortlich ist, einige zirkuläre Referenzen aufzuheben, die durch bei HTML-Elementen registrierte Ereignishandler verursacht werden, und es dem Garbage Collector zu ermöglichen, den mit diesen HTML-Elementen verbundenen Speicher freizugeben. Das Entfernen von Skript-Tags aus einer HTML-Zeichenfolge ist nicht so einfach, wie es scheint. Ein regulärer Ausdruck kann das Erwartete bewirken, obwohl schwer zu sagen ist, ob alle Möglichkeiten abgedeckt sind. Hier ist meine Lösung: /<Skript[^>]*>[\S\s]*?<\/Skript[^>]*>/ig Kombinieren wir nun diese beiden Techniken in einer einzigen setInnerHTML-Funktion und binden die setInnerHTML-Funktion an YUIs YAHOO.util.Dom: YAHOO.util.Dom.setInnerHTML = Funktion (el, html) { el = YAHOO.util.Dom.get(el); wenn (!el || Typ von html !== 'Zeichenfolge') { gibt null zurück; } // Den Zirkelverweis aufheben (Funktion (o) { var a = o.Attribute, i, l, n, c; wenn (a) { l = a.Länge; für (i = 0; i < l; i = 1) { n = a[i].Name; wenn (Typ von o[n] === 'Funktion') { o[n] = null; } } } a = o.Unterknoten; wenn (a) { l = a.Länge; für (i = 0; i < l; i = 1) { c = o.childNodes[i]; // Untergeordnete Knoten löschen argumente.callee(c); // Entfernen Sie alle auf dem Element registrierten Listener über YUIs addListener YAHOO.util.Event.purgeElement(c); } } })(el); //Entfernen Sie das Skript aus der HTML-Zeichenfolge und legen Sie die Eigenschaft innerHTML fest el.innerHTML = html.replace(/<script[^>]*>[\S\s]*?<\/script[^>]*>/ig, ""); //Gibt eine Referenz auf den ersten untergeordneten Knoten zurück gibt el.erstesKind zurück; }; Wenn diese Funktion noch etwas anderes haben sollte oder wenn mir im regulären Ausdruck etwas fehlt, lassen Sie es mich bitte wissen. Natürlich gibt es noch viele andere Möglichkeiten, Schadcode in eine Webseite einzuschleusen. Die Funktion setInnerHTML normalisiert das Ausführungsverhalten von <script>-Tags nur in allen A-Klasse-Browsern. Wenn Sie nicht vertrauenswürdigen HTML-Code einfügen möchten, stellen Sie sicher, dass dieser zuerst auf dem Server gefiltert wird. Es gibt viele Bibliotheken, die dies können. Originalartikel: Das Problem mit innerHTML von Julien Lecomte |
<<: Wie MySQL implizite Standardwerte verarbeitet
>>: Dockerfile-Implementierungscode beim Starten von zwei Prozessen in einem Docker-Container
Bei Zellen können die hellen Rahmenfarben individ...
Dieser Artikel veranschaulicht anhand von Beispie...
In diesem Artikelbeispiel wird der spezifische Co...
Heutzutage wird aufgrund der Projektanforderungen ...
Die Titelbilder in den Spalten von Zhihu Discover...
Schreiben einer Docker-Datei Konfigurieren Sie di...
1. VMware herunterladen und installieren Verknüpf...
Spring-Integration mit SpringMVC Die web.xml-Konf...
Beim Importieren von Daten mit falscher MySQL-Zei...
Umfeld Name Eigentum CPU x5650 Erinnerung 4G Sche...
Einfache Installation von opencv2: conda installi...
In diesem Artikelbeispiel wird der spezifische Ja...
In diesem Artikel wird der spezifische JavaScript...
Inhaltsverzeichnis 1. Umgebungsvariable $PATH: 2....
Laden Sie MySQL 5.7.20 / 5.7.21 herunter, install...