Closed yasulab closed 2 months ago
急ぎじゃないよ
で大丈夫そう)原因を調べるために、rexml の変更点とエラーメッセージを探したところ、下記のような処理が追加されていました。 https://github.com/ruby/rexml/compare/v3.3.2...v3.3.4#diff-f8c7cdefc29090ed525a2be70411ce741d4124853cf6425db7d18a6ea3bb9bb3R558-R561
if sum > Security.entity_expansion_text_limit
raise "entity expansion has grown too large"
end
この変更で Security.entity_expansion_text_limit
を読み込むようになり、デフォルトでは 10240 に固定されたため、エラーが起きるようになったようです。ちなみに取得先の RSS では、1,800,000 近くまで行くので、上限を超えています。
REXML::Security.entity_expansion_text_limit = 2_000_000
のように、Limit を固定することで問題なく実行できるようになる事を確認しました。このやり方だと適用範囲が大きそうなので、https://github.com/ruby/rexml/issues/192 の影響範囲を小さく設定できる機能のマージを待ってから対応してもよさそうと思っています。
.oO(私たちのコード部分では、RSS Parser を使っているので、RSS Parser 側での対応が必要なのか気になりますね… 🤔💭 )
REXML::Security.entity_expansion_text_limit = 2_000_000
FM_RSS = "https://example.com/rss"
rss = RSS::Parser.parse(FM_RSS, false)
@nanophate 早速の原因調査ありがとうございます!! 😻🆒✨ 現在のシステム構成では特にセキュリティ上問題になるような動的な RSS 入力はないという認識なので、僕も以下の対応が良いと思います! (≧∇≦)b✨
このやり方だと適用範囲が大きそうなので、ruby/rexml#192 の影響範囲を小さく設定できる機能のマージを待ってから対応してもよさそう
@yasulab @nanophate
Security.entity_expansion_text_limit
の計算方法に誤りがあったので https://github.com/ruby/rexml/pull/195 で修正しました。
https://github.com/ruby/rexml/releases/tag/v3.3.5 で修正済みですので、rexml 3.3.5 を試してみて頂ければ 🙏
@naitoh 親切にお知らせいただきありがとうございます。先ほど、下記の PR で rexml 3.3.5 にアップデートした状態で問題なく、動く事および、デプロイ時にエラーにならない事の確認ができました...!! 💯 🚀 ✨数字も1,800,000
から 4,098
とページに対して適切なサイズになってました!対応いただき改めて感謝申し上げます🙇
❯ bundle exec rails podcasts:upsert
==== START podcasts:upsert ====
Frame number: 0/42
From: /Users/vivio/.code/coderdojo.jp/vendor/bundle/ruby/3.1.0/gems/rexml-3.3.5/lib/rexml/parsers/baseparser.rb:559 REXML::Parsers::BaseParser#unnormalize:
554: if entity_value
555: re = Private::DEFAULT_ENTITIES_PATTERNS[entity_reference] || /&#{entity_reference};/
556: rv.gsub!( re, entity_value )
557: binding.pry
558:
=> 559: if rv.bytesize > Security.entity_expansion_text_limit
560: raise "entity expansion has grown too large"
561: end
562: else
563: er = DEFAULT_ENTITIES[entity_reference]
564: rv.gsub!( er[0], er[2] ) if er
[1] pry(#<REXML::Parsers::BaseParser>)> rv.bytesize
=> 4098
産地直送...!!!! 🚜💨✨ ご丁寧なコメント&アドバイスありがとうございます!!!!(>人< )💖
やること
背景
RSS のサイズが大きすぎる...? cc/ @nanophate
(要ログイン) https://dashboard.heroku.com/apps/coderdojo-japan/activity/releases/3238