Am sichersten ist es, sich auf den Browser TextNode zu verlassen, um den Inhalt korrekt zu umgehen. Hier ist ein Beispiel:
functionstripHTML(dirtyString) {
var container = document.createElement('div');
var text = document.createTextNode(dirtyString);
container.appendChild(text);
return container.innerHTML; // innerHTML will be a xss safe string
}
document.write( stripHTML('<p>some <span>content</span></p>') );
document.write( stripHTML('<script><p>some <span>content</span></p>') );
Beachten Sie hierbei, dass der Browser beim Zugriff auf die HTML-Zeichenfolgen ( innerHTML, outerHTML) den Sonderzeichen von TextNodes entgeht . Im Vergleich dazu führt der Zugriff auf Textwerte ( innerText, textContent) zu rohen Zeichenfolgen, was bedeutet, dass sie unsicher sind und XSS enthalten können.
Wenn Sie jQuery verwenden , ist die Verwendung .text()sicher und abwärtskompatibel. Siehe die anderen Antworten auf diese Frage.
Der einfachste Weg in reinem JavaScript, wenn Sie mit Browsern <= Internet Explorer 8 arbeiten, ist:
string.replace(/(<([^>]+)>)/ig,"");
Es gibt jedoch einige Probleme beim Parsen von HTML mit Regex, sodass dies keine sehr gute Sicherheit bietet. Außerdem werden nur HTML-Zeichen berücksichtigt, sodass es nicht vollständig xss-sicher ist.
Der Versuch, HTML mit regulären Ausdrücken zu entfernen, ist eine schlechte Idee .
Ymln
1
@ymln das ist längst überfällig, aber ich habe die Antwort mit viel mehr Details und einer sicheren Möglichkeit aktualisiert, Text ohne jQuery zu extrahieren.
Simon Boudrias
Dies scheint zu brechen, wenn Sie ein nicht geschlossenes '<script>' - Tag einfügen. zB console.log( stripHTML('<script><p>some <span>content</span></p>') );wird zurückkehren'<p>some <span>content</span></p>'
Matthew Wilcoxson
1
@MatthewWilcoxson hat eine Weile gebraucht, um hierher zurückzukehren, aber hier ist die Antwort behoben. Hoffentlich ohne andere Randfälle.
Simon Boudrias
2
Die bereitgestellte Funktion stripHTML entfernt kein HTML, sondern HTML-codiert Sonderzeichen.
var text = $("<p> example ive got a string</P>").text();
Update : Wie Brilliand weiter unten ausführt, wird die Eingabezeichenfolge möglicherweise als CSS-Selektor behandelt, wenn sie keine Tags enthält und Sie Pech haben. Diese Version ist also robuster:
var text = $("<div/>").html("<p> example ive got a string</P>").text();
Es ist gefährlich, den HTML-Code direkt in $ () einzufügen, da dies ihn auf andere Weise interpretieren könnte (dh als CSS-Selektor). Verwenden Sie $("<div/>").html("<p> example ive got a string</P>").text()stattdessen.
Brilliand
1
@ Brilliand: Guter Punkt. Ich habe den Vorschlag in die Antwort aufgenommen, danke!
Jon
1
@Nile: jQuery erstellt dazu DOM-Knoten und ruft deren Reintextwerte ab (wodurch der Browser die harte Arbeit effektiv erledigt), sodass Skripte gegebenenfalls ausgeführt werden. Es gibt keine Möglichkeit, diese AFAIK zu verhindern.
Jon
1
Wenn Sie mit einem dynamischen Inhalt arbeiten und der Inhalt ein einfacher Text und kein HTML ist, führt dies zu Fehlern. Also benutze ich$('<span>'+content+'</span>').text();
Anis
1
@ vipero07, in meinen Tests wird das Skript nicht ausgeführt. Die <script>Tags werden entfernt und Sie haben nur nochalert('hello');
David Cook
3
Wenn Sie das innerHTML des Elements beibehalten und nur das äußerste Tag entfernen möchten, können Sie Folgendes tun:
Antworten:
Am sichersten ist es, sich auf den Browser TextNode zu verlassen, um den Inhalt korrekt zu umgehen. Hier ist ein Beispiel:
function stripHTML(dirtyString) { var container = document.createElement('div'); var text = document.createTextNode(dirtyString); container.appendChild(text); return container.innerHTML; // innerHTML will be a xss safe string } document.write( stripHTML('<p>some <span>content</span></p>') ); document.write( stripHTML('<script><p>some <span>content</span></p>') );
Beachten Sie hierbei, dass der Browser beim Zugriff auf die HTML-Zeichenfolgen (
innerHTML
,outerHTML
) den Sonderzeichen von TextNodes entgeht . Im Vergleich dazu führt der Zugriff auf Textwerte (innerText
,textContent
) zu rohen Zeichenfolgen, was bedeutet, dass sie unsicher sind und XSS enthalten können.Wenn Sie jQuery verwenden , ist die Verwendung
.text()
sicher und abwärtskompatibel. Siehe die anderen Antworten auf diese Frage.Der einfachste Weg in reinem JavaScript, wenn Sie mit Browsern <= Internet Explorer 8 arbeiten, ist:
string.replace(/(<([^>]+)>)/ig,"");
Es gibt jedoch einige Probleme beim Parsen von HTML mit Regex, sodass dies keine sehr gute Sicherheit bietet. Außerdem werden nur HTML-Zeichen berücksichtigt, sodass es nicht vollständig xss-sicher ist.
quelle
console.log( stripHTML('<script><p>some <span>content</span></p>') );
wird zurückkehren'<p>some <span>content</span></p>'
Verwenden Sie die
.text()
Funktion:var text = $("<p> example ive got a string</P>").text();
Update : Wie Brilliand weiter unten ausführt, wird die Eingabezeichenfolge möglicherweise als CSS-Selektor behandelt, wenn sie keine Tags enthält und Sie Pech haben. Diese Version ist also robuster:
var text = $("<div/>").html("<p> example ive got a string</P>").text();
quelle
$("<div/>").html("<p> example ive got a string</P>").text()
stattdessen.$('<span>'+content+'</span>').text();
<script>
Tags werden entfernt und Sie haben nur nochalert('hello');
Wenn Sie das innerHTML des Elements beibehalten und nur das äußerste Tag entfernen möchten, können Sie Folgendes tun:
$(".contentToStrip").each(function(){ $(this).replaceWith($(this).html()); });
quelle
Dies ist ein Beispiel, um das URL-Bild abzurufen und das p-Tag von einem Element zu entfernen.
Versuche dies:
$('#img').attr('src').split('<p>')[1].split('</p>')[0]
quelle
Sie können die vorhandene Split-Funktion verwenden
Ein einfaches und abgehacktes Beispiel:
var str = '<p> example ive got a string</P>'; var substr = str.split('<p> '); // substr[0] contains "" // substr[1] contains "example ive got a string</P>" var substr2 = substr [1].split('</p>'); // substr2[0] contains "example ive got a string" // substr2[1] contains ""
Das Beispiel soll Ihnen nur zeigen, wie die Aufteilung funktioniert.
quelle