XSS очищает ввод вложенных html-тегов
Я использую антисемейную библиотеку для очистки входных данных моего приложения от 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()?
1 ответ
Антисамия дает правильный результат - плохо сформированные теги удаляются, оставляя простой текст alert('xss');
,
Рассмотрим следующее
<b<i>>Hello World!</b</i>>
Жирный и курсивный тег каким-то образом запутался - антисамия правильно удаляет сломанные теги, оставляя текст Hello World!
что правильно. То, что в исходном тесте есть простой текст, похожий на javascript, не имеет значения - вредный <script>
тег был удален.