【问题标题】:Sanitizing string before adding it to XML?在将字符串添加到 XML 之前对其进行清理?
【发布时间】:2014-02-27 13:15:04
【问题描述】:

考虑以下代码:

private XmlDocument CreateMessage(string dirtyInput)
    {
        XmlDocument xd = new XmlDocument();
        string str = @"<Message><Request>%REQ%</Request><Message>";        
        str = str.Replace("%REQ%", dirtyInput);
        xd.LoadXml(str);
        return xd;
    }

我应该采取哪些步骤来清理/验证这个dirtyInput 字符串(它可能来自不受信任的来源)?

编辑:

为了提供更多上下文,然后(由我)将此 XML“消息”发送到第三方 Web 服务。我最关心的是减轻有人可能会向我传递一个字符串的风险,该字符串可能会利用我的 XML 解析器中的漏洞,甚至可能是目标 [第三方] 端(我正在向其发送此消息)的解析器中的漏洞。很明显,我可以专注于特殊的 XML 字符,如 & 等——我是否还需要担心这些字符的转义/编码形式?可能的欺骗链接中提到的 SecurityElement.Escape 方法是否足以满足此要求?

【问题讨论】:

  • 检查您的问题的可能重复项:link.
  • 谢谢 - 添加了一个编辑部分来澄清。我确实看到了那个愚蠢的问题,但仍然不确定。

标签: c# asp.net xml security


【解决方案1】:

由于您正在生成一个 XmlDocument,您可以依靠 DOM 方法为您处理所有转义:

private XmlDocument CreateMessage(string dirtyInput)
{
    XmlDocument xd = new XmlDocument();
    xd.LoadXml(@"<Message><Request></Request></Message>");
    xd["Message"]["Request"].InnerText = dirtyInput;

    return xd;
}

【讨论】:

  • 这个解决方案看起来很干净
【解决方案2】:

取决于此字符串将应用于什么环境(Web?数据库?...)

如果是 Web 并且您正试图阻止 XSS,这将起到作用:

 HttpUtility.HtmlEncode(dirtyInput);

对于数据库,我会放弃清理以支持参数化查询。

如 cmets 中所述,您应该将 dirtyinput 包装在字符数据部分中:

 <![CDATA[
   ...
 ]]>

【讨论】:

  • 这很接近,但并不完全准确。许多 HTML 实体在 XML 中是无效的。如果你这样做,你应该指定数据是原始字符数据,用&lt;![CDATA[...]]&gt;包围它。
  • 感谢 Chris,我确实经常将 HtmlEncode 用于 XSS——这个“消息”不是作为 Web 响应发出的,它实际上是作为 Web 服务请求发送给第三方的。我担心攻击者可能会提供会使 XML 解析器关闭的输入。我可能会在以下链接msdn.microsoft.com/en-us/magazine/ee335713.aspx 中使用类似于图 6 的内容,同时验证我的输入是否包含白名单字符和特定长度。
  • CDATA 部分根本没有帮助。如果内容中包含]]&gt;,您仍然会爆炸。解决这个问题的方法(多个 CDATA 部分)比一开始就进行正确的 XML 转义更令人困惑。
猜你喜欢
  • 2013-08-15
  • 2017-07-15
  • 2011-02-17
  • 2023-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-13
相关资源
最近更新 更多