Я создаю «HTML-редактор» для моей веб-страницы. На данный момент я хочу, чтобы редактор разрешал ввод элементов HTML и CSS, а не Javascript (или JQuery, если на то пошло).
Я пытаюсь найти способ, который отключает использование <script>
или <script type="text/javascript"> </script>
с помощью PHP. Однако текущий способ выводит беспорядочный результат!
$content_in_before = str_replace('<script','',$content_in_before); $content_in_before = str_replace('script>','',$content_in_before);
Это также не очень хорошо закодировано!
Есть ли более пуленепробиваемый способ кодирования этого, останавливая использование всех типов Javascript в этой форме? (Хотя все еще разрешено использование CSS и HTML)?
Заранее спасибо!
Я бы рекомендовал использовать библиотеку санитарии, например, HTML-очиститель , поскольку для предотвращения атак XSS недостаточно просто отключить теги <script>
, поскольку JS можно автоматически выполнить с помощью таких атрибутов, как onLoad
, onMouseOver
, onUnload
и т. Д.
Чтобы удалить теги и разрешить некоторые из них, вы можете использовать strip_tags()
PHP, но она не strip_tags()
атрибуты, поэтому моя рекомендация для библиотеки санитарии HTML. Если вы можете запустить его, возможно, одним из лучших вариантов является библиотека Caja от Google, хотя она не работает в средах совместного размещения, поскольку она написана на Java, но может быть размещена в AppEngine от Google.
Кроме того, простые регулярные решения не всегда надежны, так как даже искаженные теги все еще могут быть проанализированы. Например, <script >
не был бы пойман простым регулярным выражением обычных тегов скрипта, если он не ищет пробелы после имени тега. Это можно проверить, но использование установленной библиотеки сэкономит вам время и даст вам дополнительный бонус проверенной биткой библиотеки.
Пример: Теги сценариев с пробелами, генерирующие предупреждение
Вы могли бы повторить это
echo preg_replace('/<script\b[^>]*>(.*?)<\/script>/is', "", $var);
источник: https://stackoverflow.com/a/1886842/2046700
или как заявили нам, что вы сделали это для вас, например: http://htmlpurifier.org/
другой возможный пример:
<?php $javascript = '/<script[^>]*?javascript{1}[^>]*?>.*?<\/script>/si'; $noscript = ''; $document = file_get_contents('test.html'); echo preg_replace($javascript, $noscript, $document); ?>
Белые тэги, которые вы разрешаете, и атрибуты, которые вы разрешаете, затем удалите все остальное. Вы можете использовать DOMDocument
для этого.
Я написал этот кусок кода один раз, но никогда его никто не рассматривал
function legal_html($str, $tags='<a><b><br><i><span><table><tbody><tr><td><thead><th><img>', $attribArray=false) { if ($attribArray===false) { $attribs = array('id','class','src','href','alt'); } else { $attribs = $attribArray; } $stripped = strip_tags($str,$tags); $dom = new DOMDocument(); @$dom->loadHTML('<div>'.$stripped.'</div>'); foreach ($dom->getElementsByTagName('*') as $node) { for ($i = $node->attributes->length -1; $i >= 0; $i--) { $attrib = $node->attributes->item($i); if (!in_array($attrib->name,$attribs)) $node->removeAttributeNode($attrib); } } $stripped = $dom->saveHTML(); $start = strpos($stripped,'<div>')+5; $end = strrpos($stripped,'</div>'); $stripped = trim(substr($stripped,$start,$end-$start)); return $stripped; }
Вы можете использовать что-то подобное,
$content=$_POST['textbox']; if(strpos($content,'<script>')!==false){ //show error; } else{ //proceed with work; }