2017-10-01 13 views
-1

Ce sujet ne me laisserait pas demande ses solutions pour le corps, et ou la tête, en ligne, par index etc.

remove script tag from HTML content

Je veux contrôler quel script et combien je supprime. J'espère ne pas avoir à passer par les arguments sur l'utilisation de certaines choses autres que regex encore une fois . La réponse que j'ai aimé le plus sur ce sujet était de Binh comme thusly:

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

Je veux que cette approche avec autant de contrôle de granularité possible toutefois de l'ensemble $content, cela supprime script. Je veux voir ceci pour juste enlever le manuscrit du corps, (ou du corps dessus vers le bas).

Et aussi juste de supprimer le script de la tête, (ou le corps sur le haut). Aussi par index. comme le 1er dans le corps, le 4ème dans la tête, etc.

Enfin, je voudrais voir l'enlèvement d'éléments en ligne js stuff, avec autant de contrôle que possible .

Merci

+0

« La réponse que j'aimé le plus sur ce sujet était de Binh » - Honte ça ne marche pas. https://pastebin.com/t28dn6Zt – Quentin

Répondre

0

Je vais finir par répondre à votre question, permettez-moi obtenir cette explication de ce que vous allez faire sur bien

Comme vous ne l'avez pas dit, je ne suis pas tout à fait sûr pourquoi vous vouloir le faire. Rassembler le code HTML brut d'un utilisateur et l'afficher ailleurs est considéré comme un énorme trou de sécurité. Se débarrasser de tout javascript serait difficile en utilisant purement une regex. Enlever les balises de script serait facile, mais supprimer le javascript en ligne serait la partie difficile. Bien que possible, je vais vous conseiller de trouver une autre façon d'effectuer votre tâche, autre que de donner à l'utilisateur une version dépouillée de JavaScript de la page Web.

Une façon de le faire est d'utiliser un iframe. L'utilisation de

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

désactive l'exécution de tous les javascript à l'intérieur de l'iframe. Gardez à l'esprit qu'il existe encore d'autres façons de charger des éléments malveillants dans votre site Web sans l'utilisation de javascript.

Maintenant que je l'ai expliqué ce que vous devriez faire quand il s'agit de décapage javascript, pour répondre à votre question,

A. Suppression des balises de script à partir de tout le corps ou tout simplement l'en-tête:

Le meilleur façon d'obtenir la granularité lors de la suppression de javascript serait d'utiliser la classe DOMDocument de PHP. Fondamentalement, vous allez charger le document dans cette classe DOMDocument et le dépouiller de toutes les balises de script que vous voulez. Par exemple, si vous voulez juste pour se débarrasser des balises de script dans le corps, vous pourriez écrire quelque chose comme ceci:

<?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 :) 
     */ 
    } 
} 

Le même code ci-dessus peut être utilisé pour dépouiller les scripts de la balise head. Si vous voulez supprimer des éléments avec un certain indice, vous pouvez faire ce qui suit avec votre foreach

$i=0; 
foreach($body->getElementsByTagName('script') as $script){ 
    if($i!==(INDEX_TO_KEEP)){ 
     $script->parentNode->removeChild($script); 
    } 
} 

B.Suppression du javascript en ligne

Nous pouvons utiliser le même analyseur DOMDocument, excepté l'analyse de tous les éléments cette fois-ci à la recherche de tous les événements javascript (qui, heureusement, commencent tous par le). Le code ressemblera à ceci.

<?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) 
     } 
    } 
} 

A la fin de votre code que vous voulez sauvegarder le HTML dépouillé et le retourner à l'utilisateur

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

Merci Daniel. Ça va me prendre quelques jours pour absorber et tester votre merveilleuse leçon. Vous êtes très éclairé. J'aimerais pouvoir vous PM. Je commençais à travailler sur "exploser" pour cela. Le dernier post (lié) ne semblait pas 100% pro sur le DomDocument intégré. J'ai vu d'autres built-ins venir court. Je vais devoir repenser beaucoup de choses grâce à vous. Alors dites-vous que tous les Ajax, Proxy, CORS, etc., où l'utilisateur fournit l'URL, n'ont aucun espoir d'être sécurisés? Whitelists? iframes? Merci – user4245782

+0

Chaque fois que vous permettez à l'utilisateur d'exécuter Javascript sur votre page Web, vous courez un énorme risque de sécurité. Les iframes sont capables de séparer le code des utilisateurs du site Web principal, mais ils ne sont pas parfaits. Par exemple, parce que l'utilisateur a créé le code HTML, il doit être hébergé sur votre site. Cela signifie que les fonctions Javascript créées par vos utilisateurs ont accès à tous les cookies d'authentification, c'est quelque chose que vous ne voulez jamais avoir. Si vous pouviez élaborer sur votre projet global, je pourrais peut-être vous aider à trouver une solution qui n'exige pas que l'utilisateur crée son propre Javascript. –

+0

Je suis sûr que vous pourriez. Je pourrais me faire virer cependant. Pas de PM possible? – user4245782