Я использую библиотеку antisamy для дезинфекции ввода моего приложения против XSS. У меня проблема с вложенными тегами, например:
<<b>script>alert('xss');<</b>/script>
Мой метод очистки выглядит следующим образом:
public String clean(String input) {
if (input == null) {
return null;
}
input = StringEscapeUtils.unescapeHtml(input);
try {
Policy policy = Policy.getInstance(getClass().getResourceAsStream("/antisamy-textonly-policy.xml"));
AntiSamy antiSamy = new AntiSamy();
CleanResults cleanResults = antiSamy.scan(input, policy);
String cleaned = cleanResults.getCleanHTML();
return StringEscapeUtils.unescapeHtml(cleaned);
} catch (PolicyException e) {
....
} catch (ScanException e) {
....
}
}
Мой тест на этот тип ввода не работает:
public void doubleTagTest() {
def cleaned = xss.clean("<<b>script>alert('xss');<</b>/script>");
assert cleaned.isEmpty();
}
с:
Утверждение не выполнено: assert cleaned.isEmpty() | | | ложное предупреждение ('xss');
at org.codehaus.groovy.runtime.InvokerHelper.assertFailed(InvokerHelper.java:386)
at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.assertFailed(ScriptBytecodeAdapter.java:658)
У вас есть идея, как справиться с этим без рекурсивного вызова на xss.clean()?
Антисамия дает правильный результат - удалены плохо сформированные теги (ов), оставляя текстовое alert('xss');
,
Рассмотрим следующее
<b<i>>Hello World!</b</i>>
Жирный и курсивный тег каким-то образом запутался - антисамия правильно разрывает сломанные метки, оставляя текст Hello World!
что правильно. То, что есть обычный текст, который выглядит как javascript, оставшийся в вашем исходном тесте, не вызывает беспокойства - вредоносный <script>
удален.