Пользовательское поле выпадающего списка содержит неотмечаемое значение

На моём форуме https://tzm.one есть это пользовательское поле при регистрации пользователей.

Но, похоже, спам-боты создают учётные записи со значением в этом выпадающем списке, которое невозможно выбрать. Это почти превращает поле в ловушку для спамеров (honeypot), позволяя определить, какая учётная запись создана не человеком. Однако это может также быть проблемой безопасности?

3 лайка

Это происходит потому, что боты не используют форму регистрации на фронтенде, где есть валидаторы. Такие спам-боты отправляют автоматизированные POST-запросы к конечной точке API регистрации. Также, когда поля необязательные, валидация на бэкенде иногда недостаточно строгая, и значение из payload сохраняется в базу данных.

Я не уверен, в чём заключается основное исправление, но вам, вероятно, также понадобятся дополнительные настройки или инструменты для борьбы со спамом. (Я использую 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', '')

Если вы недавно изменили это поле с текстового ввода на выпадающий список, это также может объяснить наличие некоторых ботовых аккаунтов с некорректными значениями в этом поле.

2 лайка

@Lilly прав. Здесь недостаточно недоверия на бэкенде.

Поскольку этот вопрос возник, я решил проверить, влияет ли это также на страницу профиля, и нет. Мы правильно экранируем значения, когда пользователи обновляют свой профиль. Это сделало относительно простым копирование этой логики экранирования также на конечную точку регистрации. PR здесь:

Я не думаю, что технически это так. Да, пользователи могут вводить произвольные значения, но перед отображением в любом месте всё равно применяется экранирование (так что вектора XSS нет). И ограничение длины уже правильно применялось в конечной точке регистрации (так что вектора DoS нет).

2 лайка