2010-11-30 19 views
5

En mi programa de correo electrónico, utilizo Tidy para limpiar el HTML antes de enviar los correos electrónicos. Está empezando a persistir el problema de que si envío un correo buscando el html desde una url en la web puede existir algún javascript en el documento.¿Cómo elimino todos los javascript de un documento HTML utilizando PHP?

Quiero limpiar este documento html aún más por extracción de todo el javascript, incrustado, se hace referencia y en cualquier forma para que el correo sólo existen de html.

Quiero usar php's preg_replace() para eliminar todos los javascript de un correo y necesito ayuda con la mejor expresión regular porque no es mi punto más fuerte, debo confesar.

+4

Puede hacerlo en PHP de la misma manera que lo haría en cualquier otro idioma. Y no puedes usar una expresión regular para eso. – AndreKR

Respuesta

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

Como se muestra here.

+1

1 limpio y fácil, nunca consigo aunque por qué PPL siempre usan '/' como terminadores – Hannes

+4

Esto no eliminará los javascript en 'javascript:' 'URL o datos:' URL, o en los controladores de eventos, o Javascript en CSS 'expresión (...)' u otros esquemas. Probablemente no manejará '

+3

Y esto también va a fallar gravemente en algunas entradas triviales como ' t> Alerta (1337) '. –

4

Usted puede utilizar strip_tags, pasando en las etiquetas que desea permitir (lista blanca) como segundo parámetro, pero eso no va a eliminar en línea JS - que podría estar presente en las propiedades de onclick y tal.

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

Esta solución no elimina el posible código de javascript que fue incluido por las etiquetas de script eliminado. – DrLightman

2

No hay ninguna garantía con esto (como a continuación), pero traté de hacer mi solución ligera porque el purificador html (http://htmlpurifier.org) es muy grande para mi pequeño objetivo. Mi objetivo es la prevención de XSS y nada más que el resultado de los intentos de XSS será un montón de cosas sucias para este código, pero creo que va a ser seguro:

<? 
//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 código sucio para esta luna en a casa y ... Sin embargo, no es un buen trabajo (muchas de las condiciones toman un poco de tiempo de CPU) pero es mejor que otro gran componente como el purificador html para mi pequeña meta.

resultado será:

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> 

no tengo experiencia con las expresiones CSS, pero lo que sé sobre el comportamiento de uso de JS VML en Internet Explorer para esquinas curvas por lo que puede ser peligroso. Y FINALMENTE NO HAY NINGUNA GARANTÍA.

espero que pueda ser útil para algún amigo ;)

0

que utilizan éste:

//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

Elimina todos los tags, scripts y estilos, excepto cuerpo y html, así que después de usarlo, uso strip_tags.

Cuestiones relacionadas