XSS дезинфицирует ввод вложенных html-тегов

0

Я использую библиотеку 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()?

  • 0
    Этот второй unescapeHtml кажется довольно опасным.
Теги:
security
xss
antisamy

1 ответ

1
Лучший ответ

Антисамия дает правильный результат - удалены плохо сформированные теги (ов), оставляя текстовое alert('xss'); ,

Рассмотрим следующее

<b<i>>Hello World!</b</i>>

Жирный и курсивный тег каким-то образом запутался - антисамия правильно разрывает сломанные метки, оставляя текст Hello World! что правильно. То, что есть обычный текст, который выглядит как javascript, оставшийся в вашем исходном тесте, не вызывает беспокойства - вредоносный <script> удален.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню