Skip to content

Commit

Permalink
SECURITY: Escape watched word in error message (#14434)
Browse files Browse the repository at this point in the history
  • Loading branch information
nbianca committed Sep 24, 2021
1 parent e5754de commit 1f57b29
Show file tree
Hide file tree
Showing 3 changed files with 12 additions and 4 deletions.
4 changes: 2 additions & 2 deletions lib/new_post_manager.rb
Expand Up @@ -201,10 +201,10 @@ def perform
result = NewPostResult.new(:created_post, false)
if matches.size == 1
key = 'contains_blocked_word'
translation_args = { word: matches[0] }
translation_args = { word: CGI.escapeHTML(matches[0]) }
else
key = 'contains_blocked_words'
translation_args = { words: matches.join(', ') }
translation_args = { words: CGI.escapeHTML(matches.join(', ')) }
end
result.errors.add(:base, I18n.t(key, translation_args))
return result
Expand Down
4 changes: 2 additions & 2 deletions lib/validators/watched_words_validator.rb
Expand Up @@ -5,10 +5,10 @@ def validate_each(record, attribute, value)
if matches = WordWatcher.new(value).should_block?.presence
if matches.size == 1
key = 'contains_blocked_word'
translation_args = { word: matches[0] }
translation_args = { word: CGI.escapeHTML(matches[0]) }
else
key = 'contains_blocked_words'
translation_args = { words: matches.join(', ') }
translation_args = { words: CGI.escapeHTML(matches.join(', ')) }
end
record.errors.add(:base, I18n.t(key, translation_args))
end
Expand Down
8 changes: 8 additions & 0 deletions spec/integration/watched_words_spec.rb
Expand Up @@ -32,6 +32,14 @@ def should_block_post(manager)
}.to_not change { Post.count }
end

it "escapes the blocked word in error message" do
block_word = Fabricate(:watched_word, action: WatchedWord.actions[:block], word: "<a>")
manager = NewPostManager.new(tl2_user, raw: "Want some #{block_word.word} for cheap?", topic_id: topic.id)
result = manager.perform
expect(result).to_not be_success
expect(result.errors[:base]&.first).to eq(I18n.t('contains_blocked_word', word: "&lt;a&gt;"))
end

it "should prevent the post from being created" do
manager = NewPostManager.new(tl2_user, raw: "Want some #{block_word.word} for cheap?", topic_id: topic.id)
should_block_post(manager)
Expand Down

0 comments on commit 1f57b29

Please sign in to comment.