如果JSON字符串具有未封闭的html标记,如何使用AntiXss

时间:2019-02-11 08:41:51

标签: c# xss

我们的应用程序允许用户从任何来源复制文本并将其输入到文本字段中。此类示例可能如下所示(请注意未闭合的<标签):

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 :(得分:1)

这应该做

 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));
    }