Как использовать AntiXss, если строка JSON имеет закрытые теги html - PullRequest
0 голосов
/ 11 февраля 2019

Наше приложение позволяет пользователю копировать текст из любого источника и вводить его в текстовое поле.Пример этого текста может выглядеть следующим образом (обратите внимание на незакрытый тег <):

From Sender 
Sent Monday, March 6, 2017 1132 AM
To Receiver <receiver@domain.co.za

Some email text go go here.....

Пользователь также может захотеть вставить вредоносные теги сценариев, так как это свободное текстовое поле, поэтому текстможет закончиться так:

From Sender 
Sent Monday, March 6, 2017 1132 AM
To Receiver <receiver@domain.co.za

Some email text go go here <script>alert("0");</script>.....

Мы используем Microsoft AntiXssLibrary V4.3 для очистки запроса (используя GetSafeHtmlFragment()), однако, очищенный вывод удаляет все с первого незамеченного <,таким образом, обрабатывая запрос следующим образом:

From Sender 
Sent Monday, March 6, 2017 1132 AM
To Receiver 

Сейчас я пытаюсь выполнить итерацию исходного необработанного запроса и удалить все незакрытые теги, оставляя правильно закрытые теги для обработки библиотекой.Проблема, с которой я столкнулся, заключается в том, чтобы выяснить, как перейти к следующему незамкнутому тегу после удаления первого индекса тега.

Ниже приведен пример моей попытки:

private string SanitizeInputStream(string inputStream)
        {
            var firstStartBracketPosition = inputStream.IndexOf("<");

            while(firstStartBracketPosition >= 0)
            {
                var firstEndBracketPosition = inputStream.IndexOf(">");

                if (firstEndBracketPosition < 0)
                    inputStream = inputStream.Remove(firstStartBracketPosition, 1);

                firstStartBracketPosition = inputStream.IndexOf("<");
            }

            return HttpUtility.HtmlDecode(Microsoft.Security.Application.Sanitizer.GetSafeHtmlFragment(inputStream));
        }

Поэтому идея состояла в том, чтобы пройтись по входящему запросу, найти первый индекс открытого тега, а также первый индекс закрытого тега.Если закрытый тег не был найден, первый индекс открытого тега удаляется.

1 Ответ

0 голосов
/ 11 февраля 2019

это должно сделать работу

 private string SanitizeInputStream(string inputStream)
    {
        var firstStartBracketPosition = inputStream.IndexOf("<");

        while (firstStartBracketPosition >= 0)
        {
            var secondOpenBracketPosition = inputStream.IndexOf("<", firstStartBracketPosition + 1);
            var firstEndBracketPosition = inputStream.IndexOf(">", firstStartBracketPosition + 1);
            if (firstEndBracketPosition < secondOpenBracketPosition)
            {
                if (firstEndBracketPosition < 0)
                    inputStream = inputStream.Remove(firstStartBracketPosition, 1);
            }
            else
            {
                inputStream = inputStream.Remove(firstStartBracketPosition, 1);
            }
            if (inputStream.Length < firstEndBracketPosition + 1)
            {
                firstStartBracketPosition = inputStream.IndexOf("<", firstEndBracketPosition + 1);
            }
            else
            {
                firstStartBracketPosition = -1;
            }
        }

        return HttpUtility.HtmlDecode(Microsoft.Security.Application.Sanitizer.GetSafeHtmlFragment(inputStream));
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...