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> тег был удален.

Другие вопросы по тегам