正規表現のクラッシュを監視(2025)

こちら と同様です。

再現手順

  • ウォッチワード正規表現を有効にする
  • ウォッチワードのタグアクション
  • 正規表現 *abc

結果

トピックや投稿の作成が不可能になります。

RegexpError (target of repeat operator is not specified: /(*abc)/i)
app/services/word_watcher.rb:239:in `initialize'
app/services/word_watcher.rb:239:in `new'
app/services/word_watcher.rb:239:in `word_matches?'
lib/topic_creator.rb:214:in `block in setup_tags'
lib/topic_creator.rb:213:in `each'
lib/topic_creator.rb:213:in `setup_tags'
lib/topic_creator.rb:48:in `create'
lib/post_creator.rb:493:in `create_topic'

原因

  • * は「前のトークンを0回以上繰り返す」という意味です。
  • 前のトークンがありません。
「いいね!」 2

正規表現は追加を許可する前に検証すべきということでしょうか?そして、無効な正規表現が世界全体をクラッシュさせないように、例外処理が必要ということでしょうか?

「いいね!」 1

ここで明らかに起こったのは、監視対象の単語が通常の監視対象の単語であり、* がワイルドカードであり、その後 watched words regular expressions enabled が有効になったということです。

したがって、これは

「いいね!」 1

なるほど、そう言われるとは明らかですね。:rofl:

保存時に正規表現を検証することは、非常に理にかなったことだと思われます。

これは pr-welcome ですが、チームがトリアージを行い、今後の数週間でこれを実施することが理にかなっているかどうかを判断し、将来のサポートを節約します。

「いいね!」 1

これにより、「通常の」ワイルドカード式を入力してから、ここで発生したように watched words regular expressions enabled をオンにすることを防ぐことはできません。

ここでは、正規表現の呼び出しの周りに例外ハンドラが必要だと思います。

  def word_matches?(word, case_sensitive: false)
    options = case_sensitive ? nil : Regexp::IGNORECASE
    Regexp.new(WordWatcher.word_to_regexp(word), options).match?(@raw)
  end
「いいね!」 2

RGJさん、レポートありがとうございます。これは以下で修正されます。

「いいね!」 3

このトピックは10時間後に自動的に閉じられました。返信はもうできません。