代码之家  ›  专栏  ›  技术社区  ›  Rudolf Lamprecht

如果JSON字符串有未闭合的HTML标记,如何使用Antixs

  •  0
  • Rudolf Lamprecht  · 技术社区  · 6 年前

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

    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 回复  |  直到 6 年前
        1
  •  1
  •   Luan    6 年前

    这应该能完成任务

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