2014-12-23 2 views
1

У меня есть следующий код PHP:Есть ли способ скрыть все javascript из строки в PHP?

$mystr = "<script>window.onload = function(){console.log('Hi')}</script>"; 
$mystr .= "<div onmouseover='alert('Hi')'></div"; 

Что я хочу, чтобы лишить все виды JavaScript от $ mystr.

Я пробую следующий код, но он сохраняет событие onmouseover.

$mystr = strip_tags($mystr,'<div>'); 

Я хочу удалить onmouseover или любой встроенный код javascript.

Я на самом деле пытаюсь достичь вышеуказанного в wordpress. так как я знаю, что в Wordpress нет очистителя HTML.

+0

Зачем вам это нужно? Объясните исходную задачу – zerkms

+0

Итак, вам нужен какой-то синтаксический анализатор, который удалит атрибуты x, y, z и tag q. –

+1

Мне это нужно, так как эти строковые данные на самом деле будут опубликованы на странице html. Я получаю эту строку из метода $ _POST, а затем, если в ней есть какой-то вредоносный код javascript, я попытаюсь удалить ее. – MMK

ответ

1

Вот как strip_tags работы, например:

$html = '<foo>hello<bar>world</bar></foo>'; 
$fixed = strip_tags($html, '<bar>'); 
echo $fixed; 

выходы:

hello<bar>world</bar> 

Он не понимает DOM, он не понимает JavaScript. это по сути дела:

$fixed = str_replace('<script>', '', $html); 

Единственные «СМАРТС» он признает, что теги могут иметь атрибуты и удаление тех, как хорошо.

Если вы хотите удалить тег и все его содержимое, вы должны использовать парсер DOM и полностью удалить ненужные узлы (aka tags) и их детей из дерева.

1

Вам нужно что-то вроде HTML Purifier, которое позволит вам указать белый/черный список тегов и атрибутов, которые разрешить.

0

Я использую этот код с года, чтобы очистить ввод пользователя, он всегда работает для меня.

function xss_clean($data) 
{ 
// Fix &entity\n; 
$data = str_replace(array('&amp;','&lt;','&gt;'), array('&amp;amp;','&amp;lt;','&amp;gt;'), $data); 
$data = preg_replace('/(&#*\w+)[\x00-\x20]+;/u', '$1;', $data); 
$data = preg_replace('/(&#x*[0-9A-F]+);*/iu', '$1;', $data); 
$data = html_entity_decode($data, ENT_COMPAT, 'UTF-8'); 

// Remove any attribute starting with "on" or xmlns 
$data = preg_replace('#(<[^>]+?[\x00-\x20"\'])(?:on|xmlns)[^>]*+>#iu', '$1>', $data); 

// Remove javascript: and vbscript: protocols 
$data = preg_replace('#([a-z]*)[\x00-\x20]*=[\x00-\x20]*([`\'"]*)[\x00-\x20]*j[\x00-\x20]*a[\x00-\x20]*v[\x00-\x20]*a[\x00-\x20]*s[\x00-\x20]*c[\x00-\x20]*r[\x00-\x20]*i[\x00-\x20]*p[\x00-\x20]*t[\x00-\x20]*:#iu', '$1=$2nojavascript...', $data); 
$data = preg_replace('#([a-z]*)[\x00-\x20]*=([\'"]*)[\x00-\x20]*v[\x00-\x20]*b[\x00-\x20]*s[\x00-\x20]*c[\x00-\x20]*r[\x00-\x20]*i[\x00-\x20]*p[\x00-\x20]*t[\x00-\x20]*:#iu', '$1=$2novbscript...', $data); 
$data = preg_replace('#([a-z]*)[\x00-\x20]*=([\'"]*)[\x00-\x20]*-moz-binding[\x00-\x20]*:#u', '$1=$2nomozbinding...', $data); 

// Only works in IE: <span style="width: expression(alert('Ping!'));"></span> 
$data = preg_replace('#(<[^>]+?)style[\x00-\x20]*=[\x00-\x20]*[`\'"]*.*?expression[\x00-\x20]*\([^>]*+>#i', '$1>', $data); 
$data = preg_replace('#(<[^>]+?)style[\x00-\x20]*=[\x00-\x20]*[`\'"]*.*?behaviour[\x00-\x20]*\([^>]*+>#i', '$1>', $data); 
$data = preg_replace('#(<[^>]+?)style[\x00-\x20]*=[\x00-\x20]*[`\'"]*.*?s[\x00-\x20]*c[\x00-\x20]*r[\x00-\x20]*i[\x00-\x20]*p[\x00-\x20]*t[\x00-\x20]*:*[^>]*+>#iu', '$1>', $data); 

// Remove namespaced elements (we do not need them) 
$data = preg_replace('#</*\w+:\w[^>]*+>#i', '', $data); 
do 
{ 
    // Remove really unwanted tags 
    $old_data = $data; 
    $data = preg_replace('#</*(?:applet|b(?:ase|gsound|link)|embed|frame(?:set)?|i(?:frame|layer)|l(?:ayer|ink)|meta|object|s(?:cript|tyle)|title|xml)[^>]*+>#i', '', $data); 
} 
while ($old_data !== $data); 

// we are done... 
return $data; 
} 

Надеюсь, что эта помощь.

+0

"всегда работает для вас" не достаточно хорошо. там ** WILL ** будет искаженным html, что приводит к сбою. вы его еще не встретили. единственный правильный способ безопасного манипулирования произвольным html - это парсер DOM. –

+0

Хорошо, что я ценю ваш комментарий, но, как программное обеспечение, он не может быть идеальным (концепция базового программного обеспечения). Если вы считаете, что этот код не идеален для Striping javascript, попробуйте найти инъекцию для этого, чтобы побороть его, будет понятно, что я сам тестировал весь тип XSS-инъекции против этого кода. –

+0

Кто сказал что-нибудь о xss? Я говорю неверный html. –

Смежные вопросы