gpt4 book ai didi

ruby-on-rails - REXML::RuntimeError(实体扩展变得太大)

转载 作者:数据小太阳 更新时间:2023-10-29 06:47:04 24 4
gpt4 key购买 nike

今天升级到 Ruby-1.9.3-p392 后,REXML 在尝试检索超过一定大小的 XML 响应时抛出运行时错误 - 一切正常,当接收到 25 条以下的 XML 记录时不会抛出错误,但是一旦达到特定的 XML 响应长度阈值,我收到此错误:

Error occurred while parsing request parameters.
Contents:

RuntimeError (entity expansion has grown too large):
/.rvm/rubies/ruby-1.9.3-p392/lib/ruby/1.9.1/rexml/text.rb:387:in `block in unnormalize'

我意识到这在最新的 Ruby 版本中有所改变: http://www.ruby-lang.org/en/news/2013/02/22/rexml-dos-2013-02-22/

作为快速修复,我将 REXML::Document.entity_expansion_text_limit 的大小更改为更大的数字,错误消失了。

是否有风险较小的解决方案?

最佳答案

当您发送过多内容作为 XML 响应时,会产生此问题。

要解决此问题:您需要限制单个节点中的数据(< 10k)(而不是发送整个数据,显示截断的数据并提供单独的链接以查看完整内容)

错误是从以下文件中引发的:ruby-2.1.2/lib/ruby/2.1.0/rexml/text.rb

# Unescapes all possible entities
def Text::unnormalize( string, doctype=nil, filter=nil, illegal=nil )
sum = 0
string.gsub( /\r\n?/, "\n" ).gsub( REFERENCE ) {
s = Text.expand($&, doctype, filter)
if sum + s.bytesize > Security.entity_expansion_text_limit
raise "entity expansion has grown too large"
else
sum += s.bytesize
end
s
}
end

限制 ruby-2.1.2/lib/ruby/2.1.0/rexml/text.rb 默认为 10240,这意味着每个节点 10k 数据。

REXML 已经默认为每个文档仅允许 10000 个实体替换,因此实体替换可以生成的最大文本量约为 98 兆字节。 (引用 https://www.ruby-lang.org/en/news/2013/02/22/rexml-dos-2013-02-22/ )

关于ruby-on-rails - REXML::RuntimeError(实体扩展变得太大),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15593133/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com