我们的应用程序允许用户从任何源复制文本并将其输入文本字段。此文本的示例可能如下所示(请注意
<
标签):
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));
}
因此,我们的想法是循环访问传入的请求,找到打开标记的第一个索引,以及关闭标记的第一个索引。如果找不到关闭标记,则会删除打开标记的第一个索引。