사용자 정의 드롭다운 필드에 선택할 수 없는 값이 포함되어 있습니다

제 포럼에서 사용자가 가입할 때 이 커스텀 필드를 사용하고 있습니다.

하지만 스파머 봇들이 선택할 수 없는 드롭다운 값으로 계정을 생성하는 것 같습니다. 이는 거의 인간이 만든 계정이 아닌지를 판별하는 허니팟(honeypot)처럼 기능합니다. 하지만 이것이 보안 문제가 될 수도 있을까요?

3개의 좋아요

이 문제는 봇이 검증기가 포함된 프론트엔드 가입 페이지를 사용하지 않기 때문이라고 생각합니다. 해당 스팸 봇들은 가입 API 엔드포인트에 자동화된 POST 요청을 보내고 있습니다. 커스텀 필드가 선택 사항인 경우, 백엔드에서 검증이 충분히 엄격하지 않아 페이로드 값이 데이터베이스에 저장되는 경우가 있을 수 있습니다.

핵심 수정 방법이 무엇인지는 정확히 모르지만, 스팸 방지 설정이나 도구가 더 필요할 가능성이 높습니다. Discourse Captcha? 또는 AI 스팸 탐지 기능을 사용해 보세요. (공개 포럼에서 AI 스팸 봇을 사용 중인데 효과가 매우 좋으며, 가입 시 선택 필드도 함께 사용하고 있습니다.)

포럼에서 영향을 받은 모든 사용자 계정을 Data explorer를 사용하여 찾을 수 있습니다. (커스텀 필드가 user_field_1이라고 가정합니다.)

SELECT user_id, value 
FROM user_custom_fields 
WHERE name = 'user_field_1' 
AND value NOT IN ('Bro', 'Sis', '')

최근 텍스트 입력에서 드롭다운으로 필드 유형을 변경했다면, 잘못된 필드 값을 가진 일부 봇 계정에 대한 설명이 될 수도 있습니다.

다음과 같은 curl 명령을 실행하여 이 문제를 테스트해 볼 수도 있습니다:

curl -i -X POST "https://FORUM_URL/users.json" \
-H "Api-Key: API_KEY" \
-H "Api-Username: system" \
-H "Content-Type: application/json" \
-d '{
  "name": "api test user",
  "email": "test_validation_bot@example.com",
  "password": "SuperSecretPassword123!",
  "username": "test_validation_bot",
  "active": true,
  "user_fields": {
    "FIELD_ID": "SomeInvalidText"
  }
}'

여기서 FORUM_URL은 포럼 주소, API_KEY/admin/api/keys에서 생성된 전역 API 키, FIELD_ID는 커스텀 필드의 ID입니다.

수정: 해당 curl 명령으로 방금 테스트해 보았는데, 실제로 이 문제를 재현할 수 있었습니다. 커스텀 사용자 필드 드롭다운에서 검증되지 않은 선택값으로 새 사용자를 가입시킬 수 있었습니다.

2개의 좋아요

@Lilly의 말씀이 맞습니다. 여기 백엔드에서 불신이 충분히 반영되지 않았습니다.

이 문제가 언급된 후, 프로필 페이지에도 동일한 문제가 있는지 확인해 보았는데, 그렇지 않았습니다. 사용자가 프로필을 업데이트할 때 값을 올바르게 정제(sanitize)하고 있습니다. 덕분에 해당 정제 로직을 가입 엔드포인트에도 그대로 복사하는 것이 비교적 쉬웠습니다. PR은 여기에 있습니다:

기술적으로는 그렇지 않다고 생각합니다. 네, 사용자가 임의의 값을 넣을 수는 있지만, 어디에나 렌더링되기 전에 정제가 여전히 적용되므로(XSS 벡터 없음) 문제가 없습니다. 또한 길이 제한도 이미 가입 엔드포인트에서 올바르게 적용되어 있으므로(DoS 벡터 없음) 이 부분도 안전합니다.

2개의 좋아요