2010-11-30 6 views
5

Dans mon programme de messagerie, j'utilise Tidy pour nettoyer le code HTML avant d'envoyer les courriels. Un problème est en train de persister que si j'envoie un mail en récupérant le html d'une url sur le web il peut exister du javascript dans le document.Comment supprimer tout javascript d'un document HTML en utilisant PHP?

Je veux encore plus nettoyer ce document html en supprimant tout javascript, embarqué, référencé et sous n'importe quelle forme pour que le mail n'existe qu'en html.

Je veux utiliser le preg_replace() de php pour enlever tout le javascript d'un courrier et j'ai besoin d'aide avec la meilleure regex parce que ce n'est pas mon point le plus fort que je dois avouer.

+4

Vous pouvez le faire en PHP comme vous le feriez dans n'importe quelle autre langue. Et vous ne pouvez pas utiliser une regex pour cela. – AndreKR

Répondre

9
echo preg_replace('/<script\b[^>]*>(.*?)<\/script>/is', "", $var); 

Comme indiqué here.

+1

+1 propre et facile, je ne comprends jamais pourquoi ppl utilise toujours '/' comme terminateurs – Hannes

+4

Cela ne supprimera pas javascript dans 'javascript:' URLs ou 'data:' URL, ou dans les gestionnaires d'événements, ou javascript en CSS 'expression (...)' ou d'autres schémas. Il ne traitera probablement pas '

+3

Et cela échouera aussi mal sur certaines entrées triviales comme ' t> alerte (1337)'. –

4

Vous pouvez utiliser strip_tags, en passant dans les balises que vous souhaitez permettent (whitelist) comme second paramètre, mais cela ne supprimera pas en ligne JS - qui pourrait être présente dans les propriétés onclick et autres.

echo strip_tags($html, '<p><a><small>'); 
+0

Cette solution ne supprime pas le code javascript possible qui a été inclus par les balises de script dépouillé. – DrLightman

2

Il n'y a aucune garantie avec ceci (comme ci-dessous) mais j'ai essayé de faire ma solution légère parce que le purificateur de HTML (http://htmlpurifier.org) est un peu énorme pour mon objectif minuscule. Mon but est de prévenir XSS et rien de plus si le résultat des tentatives XSS sera beaucoup de choses sales pour ce code mais je pense qu'il sera en sécurité:

<? 
//href="javascript: 
//style="....expression 
//style="....behavior 
//<script 
//on*=" 
$str = ' 
    asd 
    <a STyLE="asd; expression" hRef=" javascript:" onx="asd">asd</a> 
    asd 
    <code><a href="javascript:">asd</a></code> 
    <scr<script></script>ipt ... >asd</script> 
    <a style="hey:good boy;" href="javascript:">asd</a>'; 

function stripteaser($str, $StripHTMLTags = true, $AllowableTags = NULL) { 
    $str = explode('<code>', $str); 
    $codes = array(); 
    if (count($str) > 1) { 
     foreach ($str as $idx => $val) { 
      $val = explode('</code>', $val); 
      if (count($val) > 1) { 
       $uid = md5(uniqid(mt_rand(), true)); 
       $codes[$uid] = htmlentities(array_shift($val), ENT_QUOTES, 'UTF-8'); 
       $str[$idx] = "##$uid##" . implode('', $val); 
      } 
     } 
    } 
    $str = implode('', $str); 
    while (stripos($str, '<script') !== false) { 
     $str = str_ireplace('<script', '&lt;script', $str); 
    } 
    $rptjob = function(&$str, $regexp) { 
       while (preg_match($regexp, $str, $matches)) { 
        $str = str_ireplace($matches[0], htmlentities($matches[0], ENT_QUOTES, 'UTF-8'), $str); 
       } 
      }; 
    $rptjob($str, '/href[\s\n\t]*=[\s\n\t]*[\"\'][\s\n\t]*(javascript:|data:)/i'); //href = "javascript: 
    $rptjob($str, '/style[\s\n\t]*=[\s\n\t]*[\"][^\"]*expression/i'); //style = "...expression 
    $rptjob($str, '/style[\s\n\t]*=[\s\n\t]*[\'][^\']*expression/i'); //style = '...expression 
    $rptjob($str, '/style[\s\n\t]*=[\s\n\t]*[\"][^\"]*behavior/i'); //style = "...behavior 
    $rptjob($str, '/style[\s\n\t]*=[\s\n\t]*[\'][^\']*behavior/i'); //style = '...behavior 
    $rptjob($str, '/on\w+[\s\n\t]*=[\s\n\t]*[\"\']/i'); //onasd = " 
    if ($StripHTMLTags) 
     $str = strip_tags($str, $AllowableTags); 
    foreach ($codes as $idx => $code) { 
     $str = str_replace("##$idx##", $code, $str); 
    } 
    return $str; 
} 

echo stripteaser($str); 
exit; 
?> 

: D code sale pour cette lune home et ... Cependant, ce n'est pas un bon travail (beaucoup de temps que les conditions prennent un peu de temps CPU), mais c'est mieux qu'un autre composant énorme comme le purificateur html pour mon petit objectif.

RÉSULTAT SERA:

asd 
<a STyLE=&quot;asd; expression" hRef=&quot; javascript:" onx=&quot;asd">asd</a> 
asd 
&lt;a href=&quot;javascript:&quot;&gt;asd&lt;/a&gt; 
<scri&lt;script></script>pt ... >asd</script> 
<a style="hey:good boy;" href=&quot;javascript:">asd</a> 

Je n'ai aucune expérience à des expressions css mais je sais que sur le comportement à l'aide de JS VML dans IE pour les angles courbes peuvent donc être dangereux. ET ENFIN, IL N'EST PAS ET PAS DE GARANTIE.

je l'espère, il peut être utile pour certains amis ;)

0

J'utilise celui-ci:

//remove js,css,head..... 
static function cleanElements($html){ 

    $search = array (
     "'<script[^>]*?>.*?</script>'si", //remove js 
      "'<style[^>]*?>.*?</style>'si", //remove css 

     "'<head[^>]*?>.*?</head>'si", //remove head 
    "'<link[^>]*?>.*?</link>'si", //remove link 
    "'<object[^>]*?>.*?</object>'si" 
       ); 
     $replace = array ( 
       "", 
            "", 
       "", 
       "", 
       "" 
        );     
    return preg_replace ($search, $replace, $html); 
} 

http://allenprogram.blogspot.pt/2012/04/php-remove-js-css-head-obj-elements.html

Supprime tous les tags, les scripts et les styles, sauf le corps et html, donc après l'avoir utilisé, j'utilise strip_tags.

Questions connexes