Не делайте этого с помощью регулярных выражений. Помните, что вы не защищаете только от действительного HTML; вы защищаете DOM, создаваемые веб-браузерами. Браузеры могут быть легко обмануты, чтобы создать допустимый DOM из недействительного HTML.
Например, см. Этот список obfuscated XSS attacks. Готовы ли вы адаптировать регулярное выражение для предотвращения этой реальной атаки на Yahoo and Hotmail на IE6/7/8?
<HTML><BODY>
<?xml:namespace prefix="t" ns="urn:schemas-microsoft-com:time">
<?import namespace="t" implementation="#default#time2">
<t:set attributeName="innerHTML" to="XSS<SCRIPT DEFER>alert("XSS")</SCRIPT>">
</BODY></HTML>
Как насчет этой атаки, которая работает на IE6?
<TABLE BACKGROUND="javascript:alert('XSS')">
Как насчет атак, которые не указаны на этом сайте? Проблема с подходом Джеффа состоит в том, что это не белый список, как утверждают. Как кто-то на that page отмечает умело:
Проблема с этим, является то, что HTML должны быть чистыми. Есть случаи, когда вы можете передать в hacked html, и это не будет соответствовать ему, и в этом случае он будет вернуть взломанную строку html, так как она ничего не заменит. Это не является строго белым.
Я бы предложил использовать специально предназначенный инструмент, например, AntiSamy. Он работает, фактически анализируя HTML, а затем пересекая DOM и удаляя все, что не находится в настраиваемом белом списке. Основное различие заключается в способности грациозно обрабатывать неверный HTML.
Лучшая часть состоит в том, что на самом деле это блок-тесты для всех атак XSS на вышеуказанном сайте. Кроме того, что может быть проще, чем этот вызов API:
public String toSafeHtml(String html) throws ScanException, PolicyException {
Policy policy = Policy.getInstance(POLICY_FILE);
AntiSamy antiSamy = new AntiSamy();
CleanResults cleanResults = antiSamy.scan(html, policy);
return cleanResults.getCleanHTML().trim();
}
Что еще вам нужно? Ответы мне нравятся. – 2009-02-10 18:08:36