2010-11-30 5 views
5

電子メールプログラムでは、電子メールを送信する前にTidyを使用してHTMLを整理します。問題は、Web上のURLからhtmlを取得してメールを送信すると、ドキュメント内にいくつかのjavascriptが存在する可能性があります。PHPを使用してHTML文書からすべてのJavaScriptを取り除くにはどうすればよいですか?

すべてのjavascript、埋め込み、参照、および任意の形式でメールを削除し、htmlのみが存在するように、このhtmlドキュメントをさらにクリーンアップしたいと考えています。

phpのpreg_replace()を使って、メールからすべてのjavascriptを取り除きたいと思っています。私が告白しなければならない最強のポイントではないので、最高の正規表現について助けが必要です。

+4

他のどの言語でも同じようにPHPで行うことができます。そして、正規表現を使用することはできません。 – AndreKR

答えて

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

here

+1

+1はきれいで簡単ですが、どうしてpplがターミネータとして '/'を常に使用するのですか – Hannes

+4

これは 'javascript:' URLや 'data:' URLやイベントハンドラやJavaScriptのjavascriptでjavascriptを取り除かない'式(...)'または他のスキームを使用します。おそらく、埋め込まれたNULで '

+3

これは ' t> alert(1337)'のような簡単な入力ではうまく動作しません。 –

4

あなたは2番目のパラメータとして(ホワイトリスト)を許可するが、それはインラインJSを削除することはできませんあなたがしたいタグを渡し、strip_tagsを使用することができます - のonclickプロパティに存在し、そのようであるかもしれません。

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

許可された' 'には、「Click Me!」 – Webinan

+0

が含まれている可能性があります。このソリューションでは、取り除かれたスクリプトタグで囲まれた可能性のあるJavaScriptコードは削除されません。 – DrLightman

2

これは保証されていませんが、私の軽量ソリューションを作ることを試みました。なぜなら、HTMLの精製器(http://htmlpurifier.org)は私の小さな目標のために数少ないからです。

<? 
//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 汚いコードで 私の目標は、より多くのようにXSSの試みのための結果は、このコードの汚いものがたくさんあることでしょうが、私はそれが安全になると思う防止XSSと何にもあります家庭や...しかし、それは良い仕事ではありません(条件がいくつかのCPU時間を取る間、多くの)しかし、私の小さな目標のためのhtml浄水器のような別の巨大なコンポーネントよりも優れています。

RESULTは次のようになります。

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

私はこの1つを使用:

//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を使用します。

関連する問題