请考虑以下代码:
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方法是否适用于此?
答案 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[
...
]]>