Как я могу удалить весь JavaScript из документа HTML, используя PHP? - PullRequest
5 голосов
/ 30 ноября 2010

В моей почтовой программе я использую Tidy для очистки HTML, прежде чем отправлять электронные письма. Начинает сохраняться проблема: если я отправлю письмо, извлекающее html из URL-адреса в Интернете, в документе может существовать некоторый javascript.

Я хочу еще больше очистить этот HTML-документ, убрав весь javascript, внедренный, ссылочный и в любой форме, чтобы почта существовала только в формате html.

Я хочу использовать php preg_replace(), чтобы убрать весь javascript из почты, и мне нужна помощь с лучшим регулярным выражением, потому что это не самая сильная сторона, которую я должен признаться.

Ответы [ 5 ]

10 голосов
/ 30 ноября 2010
echo preg_replace('/<script\b[^>]*>(.*?)<\/script>/is', "", $var); 

Как показано здесь .

4 голосов
/ 30 ноября 2010

Вы можете использовать strip_tags, передавая теги, которые вы хотите разрешить (белый список) в качестве второго параметра, но это не удалит встроенный JS - который может присутствовать в свойствах onclick и тому подобное.

echo strip_tags($html, '<p><a><small>');
2 голосов
/ 20 февраля 2013

С этим нет никакой гарантии (как показано ниже), но я попытался сделать свое решение с малым весом, потому что html очиститель (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 Грязный код для этой луны дома и ... Однако это не хорошоработа (много времени, пока условия занимают немного процессорного времени), но это лучше, чем другой огромный компонент, как очиститель 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, но я знаю об использовании поведения для JS VML в IE для изогнутых углов, поэтому это может быть опасно. И, наконец, НЕТ И НЕ ГАРАНТИРУЕТСЯ.

Я надеюсь, что это может быть полезно для некоторых друзей;)

2 голосов
/ 30 ноября 2010
0 голосов
/ 06 августа 2014

Я использовал это:

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

Удаляет все теги, скрипты и стили, кроме body и html, поэтому после его использования я использую strip_tags.

...