結論「REXML::Security.entity_expansion_text_limit
に任意の値を設定する。」
結論としては上記の通りなのですが、個人で運営しているサービスで、Ruby標準ライブラリのRSSによるパース時にThis is not well formed XML\nentity expansion has grown too large
が発生するようになりました。
理由としては、以下のRexmlで対応されたセキュリティFIXによってバイトサイズのチェックがされるようになったようでした🙏(感謝)
そのため、デフォルト値である10240 bytes
を超える場合には明示的にリミットを調整する必要があります。
私は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
ちなみに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 リファレンスマニュアル)
参考)