Будет ли этот preg_match предотвратить XSS успешно? - PullRequest
2 голосов
/ 27 августа 2011

Я читал, что даже если вы удалите <script>, вы по-прежнему уязвимы для XSS.

Что-то интересное, что я нашел в качестве ответа, это <scrip<script></script>t>alert(1337)</script>

Как вы оцениваете это соответствие preg?

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

Кроме того, есть ли другие теги, которые я долженбыть в курсе атак XSS?

Ответы [ 3 ]

2 голосов
/ 27 августа 2011

strip_tags достаточно, чтобы избавиться от проблем XSS.Но использовать одно регулярное выражение нельзя, так как вам нужно очистить и внести в белый список все атрибуты и теги HTML.Браузеры чрезвычайно просты и допускают даже искаженный HTML, который не соответствует стандартам (в том числе ошибки IE).Вот почему практически невозможно использовать регулярные выражения для этого.(Несмотря на глупый SO-мем, возможно сопоставить HTML с современным языком регулярных выражений, просто слишком много усилий.)

Все решения для регулярных выражений, которые вы найдете, являются черными списками, которые не являютсясчитается надежным решением.Они пропустят половину возможных подвигов http://ha.ckers.org/xss.html

1 голос
/ 27 августа 2011

Регулярных выражений недостаточно для фильтрации опасного HTML.Вы должны правильно проанализировать HTML-код и удалить некорректные теги, а также теги, не включенные в белый список.Используйте существующую библиотеку, такую ​​как Очиститель HTML ; далеко слишком легко ошибиться.

0 голосов
/ 27 августа 2011

Вы можете попробовать удалить теги скрипта в цикле while, пока не будет найдено больше тегов скрипта:

while (preg_match("'[<]script.*?/script[>]'is",$data))
{
    $data = preg_replace("'[<]script.*?/script[>]'is","",$data);
}

Также следует проверить свойства элемента onevent, такие как: onclick, onfocus и т. Д. Они также могут содержать нежелательный XSS.

...