SECURITY: Limit the character count of group membership requests

When creating a group membership request, there is no character
limit on the 'reason' field. This can be potentially be used by
an attacker to create enormous amount of data in the database.
This commit is contained in:
Ted Johansson 2023-01-20 15:00:46 +08:00 committed by Bianca Nenciu
parent 3dcd0bc544
commit 3e0cc4a5d9
4 changed files with 29 additions and 1 deletions

View File

@ -5,7 +5,7 @@
{{i18n "groups.membership_request.reason"}}
</label>
<ExpandingTextArea @value={{this.reason}} />
<ExpandingTextArea @value={{this.reason}} @maxlength="280" />
</div>
</DModalBody>

View File

@ -1,8 +1,12 @@
# frozen_string_literal: true
class GroupRequest < ActiveRecord::Base
REASON_CHARACTER_LIMIT = 280
belongs_to :group
belongs_to :user
validates :reason, length: { maximum: REASON_CHARACTER_LIMIT }
end
# == Schema Information

View File

@ -0,0 +1,10 @@
# frozen_string_literal: true
RSpec.describe GroupRequest do
it { is_expected.to belong_to :user }
it { is_expected.to belong_to :group }
it do
is_expected.to validate_length_of(:reason).is_at_most(described_class::REASON_CHARACTER_LIMIT)
end
end

View File

@ -2040,6 +2040,20 @@ RSpec.describe GroupsController do
expect(response.status).to eq(409)
end
it "limits the character count of the reason" do
sign_in(user)
post "/groups/#{group.name}/request_membership.json",
params: {
reason: "x" * (GroupRequest::REASON_CHARACTER_LIMIT + 1),
}
expect(response.status).to eq(422)
expect(response.parsed_body["errors"]).to contain_exactly(
"Reason is too long (maximum is 280 characters)",
)
end
it "should create the right PM" do
owner1 = Fabricate(:user, last_seen_at: Time.zone.now)
owner2 = Fabricate(:user, last_seen_at: Time.zone.now - 1.day)