【问题标题】:String length limit exceeded when escaped转义时超出字符串长度限制
【发布时间】:2014-02-14 21:45:57
【问题描述】:

文本被引入系统,它可以是任何东西,它必须作为文本存储在数据库中(这里有长度限制),并且它必须被转义以保证 XML 安全。

在这种情况下(长度限制为 6):

string theInput = "hell&";

它会被转义到

"hell&"

然后保存到(截断)

"hell&a"

现在的问题是我假设输入被很好地转义了,而事实并非如此。

在这种情况下,所需的输出将是“地狱”,因为我对保存无法正确存储转义输出的内容不感兴趣。

是否有内置函数来实现这一点? (.NET 框架 4),例如;

SecurityElement.Escape(text, maxLen); //this overload does not exist :(

如果没有,有什么建议吗?

编辑:只是为了澄清;输入必须以 XML 安全的方式存储(在 DB 上),因为系统的其他部分需要这种方式(包括不容易更新客户端)

【问题讨论】:

  • 我会考虑另一种方法。一种可能性:只存储用户输入的内容。在显示数据之前检索数据时执行转义。如果您必须在存储之前对文本进行转义,请编写一个 CustomValidator,在验证输入时执行转义,如果结果字符串太长,则验证失败。
  • 是否有内置函数可以实现这一点?没有。还有问题吗?
  • @L.B "如果没有,有什么建议吗?"
  • @BobKaufman 输入不能被拒绝,因为转义结果太长了,很多客户端都动弹不得
  • @BobKaufman 说得对。在 XML 序列化时执行此操作,而不是在数据库存储时执行此操作。无论如何,数据库不应该知道或关心您如何使用文本。

标签: c# .net xml text escaping


【解决方案1】:

没有任何内置功能可以实现您想要的。您需要做的是转义整个字符串,然后检查长度。如果超过最大值,则必须检查最大索引处的字符是否介于 & 和 ; 之间。如果是,则需要进一步分析。

【讨论】:

  • 我有一段代码可以解决这个问题(基本上是在最后搜索格式错误的转义码),但它并没有涵盖所有可能的结果,因为它将运行数百万在某些情况下每小时的次数,我正在寻找被广泛使用和测试的东西
  • 很遗憾,恐怕没有其他答案了。您可能希望在出现可能性时涵盖它们,以便在中长期您的代码将涵盖大部分(如果不是全部)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多