Madogiwa Blog

主に技術系の学習メモに使っていきます。

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

結論「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する時だけリミットを上書きするようにしました。

    def parse!
      # NOTE: 大きめのRSSをパース可能にするために、entity_expansion_text_limitを設定
      REXML::Security.with(entity_expansion_text_limit: text_limit) do
        RSS::Parser.parse(resource)
      rescue RSS::InvalidRSSError
        RSS::Parser.parse(resource, false)
      end
    end

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