정규식 'Watched word' 충돌 확인 (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개의 좋아요

정규식을 추가하기 전에 먼저 유효성을 검사해야 하는 것이 맞나요? 그리고 잘못된 정규식이 전체 시스템을 중단시키지 않도록 예외 처리(rescue)도 있어야 하는 것 아닌가요?

1개의 좋아요

여기서 분명히 일어난 일은, 감시 대상 단어(watched words)가 일반적인 감시 대상 단어였고 *가 와일드카드였으며, 그 후 watched words regular expressions enabled 기능이 활성화되었다는 것입니다.

즉, 이 경우

1개의 좋아요

음, 그렇게 말씀해 주시니 이제야 당연하군요. :rofl:

저장 시 정규식을 통해 유효성을 검증하는 것은 매우 합리적인 조치라고 생각합니다.

이 이슈에 pr-welcome 라벨을 붙이겠지만, 향후 지원 업무를 줄이기 위해 앞으로 몇 주 안에 이 작업을 수행하는 것이 적절한지 팀에서 분류하여 결정할 것입니다.

1개의 좋아요

이 방식으로는 사람들이 “일반” 와일드카드 표현식을 입력한 이후감시 단어 정규식 활성화 옵션을 켜는 것을 막을 수 없습니다. 이번 사례가 바로 그런 경우였습니다.

정규식 호출 주위에 예외 처리기를 추가하는 것만으로도 충분할 것 같습니다.

  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시간 후 자동으로 닫혔습니다. 더 이상 새 답글을 작성할 수 없습니다.