2009-12-11 55 views
16

我正在尝试从HTML中删除JavaScript。PHP删除JavaScript

我无法使用正则表达式来使用PHP;它给了我一个空数组。为什么?

<?php 
$var = ' 
<script type="text/javascript"> 
function selectCode(a) 
{ 
    var e = a.parentNode.parentNode.getElementsByTagName(PRE)[0]; 
    if (window.getSelection) 
    { 
     var s = window.getSelection(); 
     if (s.setBaseAndExtent) 
     { 
     s.setBaseAndExtent(e, 0, e, e.innerText.length - 1); 
     } 
     else 
     { 
     var r = document.createRange(); 
     r.selectNodeContents(e); 
     s.removeAllRanges(); 
     s.addRange(r); 
     } 
    } 
    else if (document.getSelection) 
    { 
     var s = document.getSelection(); 
     var r = document.createRange(); 
     r.selectNodeContents(e); 
     s.removeAllRanges(); 
     s.addRange(r); 
    } 
    else if (document.selection) 
    { 
     var r = document.body.createTextRange(); 
     r.moveToElementText(e); 
     r.select(); 
    } 
} 
</script> 
'; 

    function remove_javascript($java){ 
    echo preg_replace('/<script\b[^>]*>(.*?)<\/script>/i', "", $java); 

    }  
?> 
+2

我想更好地利用一些适当的库来杀死那些 EVIL_CODES' – YOU 2009-12-11 09:19:00

+0

不工作得到同样的事情 – Saxtor 2009-12-11 09:20:52

+1

如果您试图阻止XSS,我认为您应该在尝试一些无用之前阅读此页http://ha.ckers.org/xss.html。有很多方法来注入脚本。 – Arkh 2009-12-11 10:50:27

回答

59

这应该这样做:

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

/s是使点。也匹配换行符。

只是一个警告,你不应该使用这种类型的正则表达式来消毒网站的用户输入。有太多的方法来解决它。对于消毒使用类似http://htmlpurifier.org/

+0

感谢百万:) – Saxtor 2009-12-11 09:27:44

+0

我认为这不包括前面提到的情况, 这正是试图绕过这种检查的人会做的。 – 2009-12-11 10:57:12

+0

浏览器真的会在''内运行吗?我发现很难相信... – gnud 2009-12-11 21:51:54

3

这可能做的比你想多了,而是根据自己的情况你可能想看看strip_tags

1

在你的情况,你可以把字符串作为换行符的列表分隔字符串,并删除包含脚本标签(第一&倒数第二)的线,你甚至不会需要定期表达式。

虽然如果你想要做的是防止XSS它可能不足以仅删除脚本标记。

+0

非常感谢您的建议,但是我正在做的是创建一个开膛手,这是我的班级代码所需要的,谢谢你们! – Saxtor 2009-12-11 10:09:42

1

这里有一个想法

while (true) { 
    if ($beginning = strpos($var,"<script")) { 
    $stringLength = (strpos($var,"</script>") + strlen("</script>")) - $beginning; 
    substr_replace($var, "", $beginning, $stringLength); 
    } else { 
    break 
    } 
} 
0

我用这个:

function clear_text($s) { 
    $do = true; 
    while ($do) { 
     $start = stripos($s,'<script'); 
     $stop = stripos($s,'</script>'); 
     if ((is_numeric($start))&&(is_numeric($stop))) { 
      $s = substr($s,0,$start).substr($s,($stop+strlen('</script>'))); 
     } else { 
      $do = false; 
     } 
    } 
    return trim($s); 
} 
+0

不适用于我 – 2012-03-01 11:21:12

0
function clean_jscode($script_str) { 
    $script_str = htmlspecialchars_decode($script_str); 
    $search_arr = array('<script', '</script>'); 
    $script_str = str_ireplace($search_arr, $search_arr, $script_str); 
    $split_arr = explode('<script', $script_str); 
    $remove_jscode_arr = array(); 
    foreach($split_arr as $key = > $val) { 
     $newarr = explode('</script>', $split_arr[$key]); 
     $remove_jscode_arr[] = ($key == 0) ? $newarr[0] : $newarr[1]; 
    } 
    return implode('', $remove_jscode_arr); 
} 
+1

您介意评论/描述您的解决方案吗? – 2013-02-20 08:44:24

+0

欢迎评论 – 2013-02-20 19:17:29

0

这对我来说是非常有用的。试试这个代码。

while(($pos = stripos($content,"<script"))!==false){ 
    $end_pos = stripos($content,"</script>"); 
    $start = substr($content, 0, $pos); 
    $end = substr($content, $end_pos+strlen("</script>")); 
    $content = $start.$end; 
} 
$text = strip_tags($content);