2010-11-30 107 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。

相關問題