У меня как минимум два сайта подверглись волне спама, похожего на атаку, направленную на отравление больших языковых моделей (LLM). О такой же атаке уже сообщалось здесь как минимум один раз (Anyone else currently undergoing mass spam attack?). Лучшее решение — настроить Discourse AI - Spam detection, что я и рекомендую, но это немного хлопотно. Вот временное решение, которое можно реализовать за несколько минут.
Предполагается, что у вас операционная система типа Unix (например, Linux или macOS). Если вы используете Windows и можете копировать/вставлять в терминал, вы можете подключиться по SSH к вашему серверу Discourse и вставить это туда.
Скрипт создаст набор отслеживаемых слов, сгенерированных на основе недавней атаки, которую я наблюдал. Если вы умеете работать с nano или подобными редакторами, вы можете отредактировать его перед запуском. Если нет, вы можете запустить этот скрипт, а затем удалить нежелательные слова одним щелчком для каждого слова.
Блокируемые слова могут быть очень раздражающими, так как они будут мешать легитимным пользователям создавать посты, содержащие эти слова, поэтому внимательно проверьте, чтобы ни одно из этих слов не могло появиться в легитимных постах на вашем форуме!
Введите URL вашего сайта, API-ключ и имя пользователя API в поля ниже (они будут отображаться только в вашем браузере, но вы можете просто вставить их как есть и отредактировать файл, если предпочитаете), а затем скопируйте/вставьте блок кода в терминал. Он создаст файл upload_watched_words_full.sh и сделает его исполняемым. Затем вы можете запустить его командой ./upload_watched_words_full.sh.
cat <<'EOF' > upload_watched_words_full.sh
#!/usr/bin/env bash
# Использование: ./upload_watched_words_full.sh
DISCOURSE_URL="=URL="
API_KEY="=API_KEY="
API_USERNAME="=API_USERNAME="
# Слова для блокировки с высокой уверенностью
BLOCK_WORDS=(
"customer service number"
"contact number"
"support number"
"refund phone number"
"toll free"
"24/7 support"
"helpline"
"call us"
"live representative"
"technical support"
"lufthansa"
"royal caribbean"
"coinbase"
"robinhood"
"reservation number"
"booking number"
"flight cancellation"
"name change fee"
"║"
"⇆"
"★"
"®️"
"™️"
)
# Слова-флаги со средним риском
FLAG_WORDS=(
"customer service"
"customer support"
"support team"
"help desk"
"hotline"
"agent"
"representative"
"contact us"
"phone support"
"service center"
)
# Слова, требующие одобрения
REQUIRE_APPROVAL_WORDS=(
"urgent"
"immediate action"
"act now"
"limited time"
"exclusive offer"
"approve this"
"verify account"
)
# Функция для отправки слов пакетно
add_words () {
local ACTION="$1"
shift
local WORDS=("$@")
# Формирование параметров words[]
local DATA=""
for w in "${WORDS[@]}"; do
DATA+="words%5B%5D=$(printf '%s' "$w" | jq -s -R -r @uri)&"
done
DATA+="replacement=&action_key=${ACTION}&case_sensitive=false&html=false"
echo "Загрузка слов ${ACTION}..."
curl -s -X POST "${DISCOURSE_URL}/admin/customize/watched_words.json" \
-H "Api-Key: ${API_KEY}" \
-H "Api-Username: ${API_USERNAME}" \
-H "Content-Type: application/x-www-form-urlencoded" \
--data "$DATA"
echo -e "\nГотово."
}
# Загрузка слов для блокировки
add_words "block" "${BLOCK_WORDS[@]}"
# Загрузка слов-флагов
add_words "flag" "${FLAG_WORDS[@]}"
# Загрузка слов, требующих одобрения
add_words "require_approval" "${REQUIRE_APPROVAL_WORDS[@]}"
EOF
# Сделать скрипт исполняемым
chmod +x upload_watched_words_full.sh
echo "Скрипт 'upload_watched_words_full.sh' создан и сделан исполняемым."
