2010-11-30 106 views
5

在我发送电子邮件之前,我使用Tidy清理HTML。一个问题开始持续下去,如果我发送邮件从web上的url获取html,那么文档中可能存在一些javascript。如何使用PHP去除HTML文档中的所有JavaScript?

我想清除这个html文件更多通过剥离出所有的JavaScript,嵌入,引用和任何形式,使邮件只存在的HTML。

我想用php的preg_replace()去掉邮件中的所有javascript,我需要一些最好的正则表达式的帮助,因为这不是我最强烈的要求,我必须承认。

+4

您可以像使用任何其他语言一样使用PHP。你不能使用正则表达式。 – AndreKR 2010-11-30 12:46:23

回答

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

如图所示here

+1

+1 clean and easy,我从不明白为什么ppl总是使用`/`作为终止符 – Hannes 2010-11-30 13:07:17

+4

这不会去掉`javascript:`URL或`data:`URL中的javascript,或者事件处理程序中的javascript或javascript中的javascript `表达(...)`或其他方案。它可能不会处理嵌入NUL的`

4

您可以使用strip_tags,传递您希望标签允许(白名单)作为第二个参数,但不会删除内联JS - 这可能是目前在的onclick属性和这样。

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

这不能保证(如下),但我试图让我的轻量级解决方案,因为净化器(http://htmlpurifier.org)是我的小目标的几个巨大。 我的目标是防止XSS,仅此而已,因此结果为XSS尝试会有很多的脏东西此代码,但我认为这将是安全的:

<? 
//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 脏代码这个月亮家庭和...但它不是一个好工作(很多情况下需要几个CPU时间),但它比另一个巨大的组件如html净化器为我的小目标更好。

结果将是:

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> 

我没有经验到CSS表达式,但我在IE中使用JS VML的弯角所以可能是危险的了解行为。 最后没有,也没有保证。

我希望它可以为一些朋友 有用)

0

我用这一个:

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

删除所有标签,脚本和样式,除了身体和HTML,所以在使用它之后,我使用strip_tags。

相关问题