我必须启动并运行一个快速而肮脏的配置编辑器。流程是这样的:
配置(服务器上的 POCO)被序列化为 XML。
在这一点上,XML 格式良好。配置被发送到 XElements 中的 Web 服务器。
在 Web 服务器上,XML(是的,全部)被转储到文本区域中进行编辑。
用户直接在网页中编辑 XML 并单击提交。
在响应中,我检索了 XML 配置的更改文本。此时,所有转义都已通过在网页中显示它们的过程恢复。
我尝试将字符串加载到 XML 对象(XmlElement、XElement 等)中。卡布姆。
问题是序列化会转义属性字符串,但这会在翻译过程中丢失。
例如,假设我有一个具有正则表达式的对象。这是 Web 服务器的配置:
<Configuration>
<Validator Expression="[^<]" />
</Configuration>
所以,我把它放到了一个 textarea 中,对用户来说它看起来像这样:
<Configuration>
<Validator Expression="[^<]" />
</Configuration>
因此,用户进行了轻微的修改并将更改提交回来。在 Web 服务器上,响应字符串如下所示:
<Configuration>
<Validator Expression="[^<]" />
<Validator Expression="[^&]" />
</Configuration>
因此,用户添加了另一个验证器,现在两者都具有非法字符的属性。如果我尝试将其加载到任何 XML 对象中,它会引发异常,因为 < 和 & 在文本字符串中无效。I CANNOT CANNOT CANNOT CANNOT 不能使用任何类型的编码功能,因为它编码了整个血腥的东西:
var 结果 = Server.HttpEncode(editedConfig);
结果是
<Configuration>
<Validator Expression="[^<]" />
<Validator Expression="[^&]" />
</Configuration>
这不是有效的 XML。如果我尝试将它加载到任何类型的 XML 元素中,我将被落下的铁砧击中。我不喜欢坠落的铁砧。
所以,问题仍然存在......我可以让这个字符串 XML 准备好解析为 XML 对象的唯一方法是使用正则表达式替换吗?加载时有什么方法可以“关闭约束”吗?你怎么解决这个问题???
最后一个回复,然后对其进行维基化,因为我认为没有有效的答案。
我放在 textarea 中的 XML 是有效的、转义的 XML。1) 将其放入文本区域 2) 将其发送到客户端 3) 将其显示给客户端 4) 提交其所在的表单 5) 将其发送回服务器和 6) 从表单中检索值的过程任何和所有的逃避。
让我再说一遍:我没有逃避任何事情。只需在浏览器中显示它就可以了!
需要考虑的事情:有没有办法从一开始就防止这种无法逃脱的事情发生?有没有办法获取几乎有效的 XML 并以安全的方式“清理”它?
这个问题现在有一个赏金。为了收集赏金,您演示了如何在浏览器窗口中编辑 VALID XML,而无需使用不需要我使用正则表达式手动转义属性值的第 3 方/开源工具,也不需要用户转义他们的属性,并且在往返时不会失败(&amp;amp;etc;)