2009-12-11 32 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);