Quantcast
Channel: ruby - Madogiwa Blog
Viewing all articles
Browse latest Browse all 35

Ruby: RSSのパースが`This is not well formed XML\nentity expansion has grown too large`で落ちた時の対処法メモ📝

$
0
0

結論「REXML::Security.entity_expansion_text_limitに任意の値を設定する。」

結論としては上記の通りなのですが、個人で運営しているサービスで、Ruby標準ライブラリのRSSによるパース時にThis is not well formed XML\nentity expansion has grown too largeが発生するようになりました。

理由としては、以下のRexmlで対応されたセキュリティFIXによってバイトサイズのチェックがされるようになったようでした🙏(感謝)

github.com

そのため、デフォルト値である10240 bytesを超える場合には明示的にリミットを調整する必要があります。

docs.ruby-lang.org

私はRuby on Railsで構築したサービス内で利用していたのでRails v7.1で追加されたObject#withを使って以下のようにParseする時だけリミットを上書きするようにしました。

defparse!# NOTE: 大きめのRSSをパース可能にするために、entity_expansion_text_limitを設定REXML::Security.with(entity_expansion_text_limit: text_limit) doRSS::Parser.parse(resource)
      rescueRSS::InvalidRSSErrorRSS::Parser.parse(resource, false)
      endend

www.shakacode.com

ちなみにREXML::Document.entity_expansion_text_limitは、非推奨なのでご注意ください。

REXML::Document.entity_expansion_text_limit このメソッドは Ruby 2.1 から deprecated になりました。 REXML::Security.entity_expansion_text_limit を使ってください。 REXML::Document.entity_expansion_text_limit (Ruby 3.3 リファレンスマニュアル)

参考)

obel.hatenablog.jp

stackoverflow.com


Viewing all articles
Browse latest Browse all 35

Trending Articles