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()
« La réponse que j'aimé le plus sur ce sujet était de Binh » - Honte ça ne marche pas. https://pastebin.com/t28dn6Zt – Quentin