2009-12-11 12 views
16

Próbuję usunąć JavaScript z kodu HTML.PHP Usuń JavaScript

Nie mogę uzyskać wyrażenia regularnego do pracy z PHP; daje mi tablicę zerową. Czemu?

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

myślę, lepiej korzystać z niektórych odpowiednich bibliotek do zabicia tych EVIL_CODES' – YOU

+0

nie pracuje się tak samo – Saxtor

+1

Jeśli próbujesz zapobiec XSS, myślę, że powinieneś przeczytać tę stronę http://ha.ckers.org/xss.html zanim spróbujesz czegoś bezużytecznego. Istnieje wiele metod wstrzykiwania skryptów. – Arkh

Odpowiedz

59

powinno to zrobić:

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

/s jest tak, że kropka. dopasowuje również nowe linie.

Po prostu ostrzeżenie, nie należy używać tego rodzaju wyrażeń regularnych do odkażania danych wprowadzanych przez użytkownika dla witryny internetowej. Jest zbyt wiele sposobów na obejście tego. Do dezynfekcji używać coś jak biblioteki http://htmlpurifier.org/

+0

DZIĘKI MILIONOWI :) – Saxtor

+0

Myślę, że to nie dotyczy przypadku wspomnianego wcześniej, , co jest dokładnie tym, co zrobiłby ktoś, kto próbował ominąć taki czek. –

+0

Czy przeglądarka rzeczywiście uruchomi coś wewnątrz ''? Uważam, że trudno w to uwierzyć ... – gnud

3

To może zrobić więcej niż chcesz, ale w zależności od sytuacji może warto spojrzeć na strip_tags.

1

W twoim przypadku można traktować jako ciąg listy nowej linii rozdzielany ciągi i usunąć wiersze zawierające tagów Script (pierwszy & przedostatnia), a ty nawet nie trzeba regularne wyrażenia.

Chociaż jeśli próbujesz zapobiec XSS, może to nie wystarczyć do usunięcia tylko znaczników skryptu.

+0

również dziękuję za poradę, ale to, co robię, to tworzenie rippera, więc było to potrzebne w moim kodzie klasowym, dziękuję wam! – Saxtor

1

Oto pomysł

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

Używam tego:

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

nie działa dla mnie –

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

Czy mógłbyś komentować/opisywać swoje rozwiązanie? –

+0

mile widziane komentarze –

0

było to bardzo przydatne dla mnie. spróbuj tego kodu.

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);