Наше приложение позволяет пользователю копировать текст из любого источника и вводить его в текстовое поле.Пример этого текста может выглядеть следующим образом (обратите внимание на незакрытый тег <
):
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));
}
Поэтому идея состояла в том, чтобы пройтись по входящему запросу, найти первый индекс открытого тега, а также первый индекс закрытого тега.Если закрытый тег не был найден, первый индекс открытого тега удаляется.