2017-10-01 8 views
-1

Dieses Thema würde mich nicht verlangen, es Lösungen für den Körper, und oder Kopf, inline, durch Index etc.

remove script tag from HTML content

Ich möchte Kontrolle über welche und wie viel Skript ich entfernen.

Ich hoffe, ich muss nicht durch die Argumente über die Verwendung bestimmter Dinge anders als Regex noch einmal durchlaufen. Die Antwort, die ich am meisten war von Binh als thusly zu diesem Thema gefallen:

$html = preg_replace("/<script.*?\/script>/s", "", $html) ? : $html; 

ich mit so viel Granularität Kontrolle wie möglich, diesen Ansatz wollen aber dieses Skript aus dem gesamten $content entfernt. Ich möchte dies nur für das Entfernen von Skript aus dem Körper sehen (oder von Körper auf den unteren Rand).

Und auch nur Skript vom Kopf entfernen (oder Körper bis weit oben). Auch nach Index. wie 1. in Körper, 4. in Kopf, etc.

Schließlich würde ich gerne Inline-Element js Zeug entfernen sehen, mit so viel Kontrolle wie möglich.

Dank

+0

„Die Antwort mochte ich am meisten zu diesem Thema von Binh war“ - Shame es funktioniert nicht. https://pastebin.com/t28dn6Zt – Quentin

Antwort

0

ich schließlich Ihre Frage beantworten, lassen Sie mich diese Erklärung von dem, was du bist über

obwohl

tun über Wie Sie nicht gesagt haben, ich bin mir nicht ganz sicher, warum würden Sie möchte das machen. Das Sammeln von Roh-HTML von einem Benutzer und das Anzeigen an anderer Stelle wird als großes Sicherheitsloch betrachtet. Es würde schwierig sein, alles Javascript loszuwerden, wenn man nur eine Regex verwendet. Das Entfernen der Script-Tags wäre einfach, aber das Entfernen des Inline-Javascript wäre der schwierige Teil. Wenn möglich, empfehle ich Ihnen, einen anderen Weg zu finden, um Ihre Aufgabe zu erfüllen, als dem Benutzer eine javascript-reduzierte Version der Webseite zu geben.

Ein Weg, wie Sie es tun könnten, ist über einen Iframe. Verwenden

<iframe src="html_you_want_to_strip" sandbox=""></iframe> 

deaktiviert alle Javascript innerhalb des Iframe ausgeführt werden. Beachten Sie, dass es auch andere Möglichkeiten gibt, mit denen schädliche Elemente ohne JavaScript in Ihre Website geladen werden können.

Nun, da ich erklärt habe, was Sie tun sollten, wenn sie Javascript Strippen kommt, Ihre Frage zu beantworten,

A. Löschen von Script-Tags aus nur den Körper oder nur die Header:

Die beste Möglichkeit, Granularität zu erhalten, wenn JavaScript entfernt wird, wäre PHP DOMDocument-Klasse zu verwenden. Im Grunde werden Sie das Dokument in diese DOMDocument-Klasse laden und es von den gewünschten Skript-Tags entfernen.

<?php 
$html = "the HTML you want filtered"; 
$DOM = new DOMDocument('1.0','utf-8'); 
$DOM->loadHTML($html); 
$bodyTags = $DOM->getElementsByTagName('body'); 
/* 
We will run under the assumption that the user has the ability to add two 
body tags and hide information in the second one, that is why we don't 
just use $DOM->getElementsByTagName('body')[0] 
*/ 
foreach($bodyTags as $body){ 
    foreach($body->getElementsByTagName('script') as $script){ 
     $script->parentNode->removeChild($script); 
     /* 
     The reason we have to this is because you cant just do 
     $script->remove(), that would be too easy :) 
     */ 
    } 
} 

Der gleiche Code oben verwendet werden könnte abzustreifen Skripte aus dem Head-Tag: Zum Beispiel, wenn Sie nur die Beseitigung der Script-Tags in dem Körper gelangen wollen, könnten Sie so etwas schreiben. Wenn Sie Artikel mit einem bestimmten Index löschen möchten, können Sie folgende Schritte mit Ihrem Foreach ausführen:

B.Das Inline-JavaScript entfernen

Wir können den gleichen DOMDocument-Parser verwenden, außer das Parsen aller Elemente dieses Mal nach allen Javascript-Ereignissen (die glücklicherweise alle mit on beginnen). Der Code sieht folgendermaßen aus.

<?php 
//starting where the last code leaves off 
foreach($DOM->getElementsByTagName('*') as $element){ 
    //This selects all elements 
    foreach($element->attributes as $attribute){ 
     if(preg_match('/on.*/',$attribute)==1){ 
      /* 
      "on" looks for on and ".*" states that there 
      can be anything after the on (onmousemove,onload,etc.) 
      */ 
      $element->removeAttribute($attribute) 
     } 
    } 
} 

Am Ende des Codes werden Sie die gestrippt HTML zu speichern und sie an den Benutzer zurück

$parsedHTML = $DOM->saveHTML() 
+0

Danke Daniel. Ich werde ein paar Tage brauchen, um deine wundervolle Lektion aufzunehmen und zu testen. Du bist sehr erleuchtet. Ich wünschte ich könnte dich besuchen. Ich begann die Arbeit an "explode" dafür. Der letzte Beitrag (verlinkt) schien nicht 100% ig über die eingebaute DomDocument Sache zu sein. Ich habe gesehen, dass andere Built-Ins zu kurz kommen. Ich werde viele Dinge dank dir überdenken müssen. Also sagst du, dass alle Ajax, Proxy, CORS, etc. wo Benutzer die URL bereitstellt, keine Hoffnung haben, sicher zu sein? Whitelists? iframes? Danke – user4245782

+0

Jedes Mal, wenn Sie zulassen, dass der Benutzer Javascript auf Ihrer Webseite ausführen kann, haben Sie ein großes Sicherheitsrisiko. Iframes sind in der Lage, den Benutzercode von der übergeordneten Website zu trennen, aber sie sind nicht perfekt. Da der Benutzer beispielsweise den HTML-Code erstellt hat, muss er auf Ihrer Website gehostet werden. Dies bedeutet, dass die von Ihren Benutzern erstellten Javascript-Funktionen Zugriff auf alle Authentifizierungs-Cookies haben. Das ist etwas, was Sie nie wollen. Wenn Sie näher erläutern könnten, was Ihr gesamtes Projekt ist, könnte ich Ihnen vielleicht helfen, eine Lösung zu finden, bei der der Benutzer kein eigenes Javascript erstellen muss. –

+0

Ich bin mir sicher, dass Sie das könnten. Ich könnte jedoch gefeuert werden. Keine PM möglich? – user4245782

Verwandte Themen