在将字符串添加到XML之前清理字符串?

时间:2014-02-27 13:15:04

标签: c# asp.net xml security

请考虑以下代码:

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字符,如&lt; &GT; &安培;等 - 我还需要担心这些字符的转义/编码形式吗?可能的欺骗链接中提到的SecurityElement.Escape方法是否适用于此?

2 个答案:

答案 0 :(得分:4)

由于您正在生成XmlDocument,因此您可以依赖DOM方法来处理所有转义:

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

    return xd;
}

答案 1 :(得分:0)

取决于该字符串将应用于何种环境(Web?数据库?...)

如果它是网络并且你试图阻止XSS,那么这将起到作用:

 HttpUtility.HtmlEncode(dirtyInput);

对于数据库,我放弃了清理,转而采用了参数化的查询。

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

 <![CDATA[
   ...
 ]]>