大量のスパムに関するヘルプ

これは厄介な問題です。以下に背景情報を示します。

私は、コミュニティに多大な期待が寄せられているコミュニティを運営しています。プロジェクトを追跡している人は100万人を超え、開発者がコミュニティを支援するためにDiscourseフォーラムを設置しました。基本的に、これは私たちのプロジェクトとやり取りするための開発者サポートフォーラムであり、開発関連コンテンツ以外の投稿は許可していません。

約3日前に、著名なYoutube/Twitterのインフルエンサーが、サポートフォーラムに登録して投稿すると、私たちのチームから報酬/景品を受け取る資格が得られるという虚偽の主張をしました。これは全くの虚偽であり、その結果、過去3日間、ほぼ絶え間なく登録があり、フォーラムに多くのスパム投稿やトピックが投稿されています。

現在、1日あたり2,500から7,500件の登録があり、主にアジアおよび中東の国々(特に2つの国が主要な違反者として目立っています)からのものです。

登録しているユーザーは、ボットと実際のユーザーの混合のようです。IPアドレスはほとんどがユニーク(IPv4とIPv6の健全な混合)であり、IPv4側で多数を排除するための顕著なサブネットを禁止するようなものはありません(IPv6では/24ブロックを禁止することに多少の成果がありましたが、簡単に回避できるようです)。メールアドレスはすべてGmailであり、その多くは使い捨て/ボットのメールアドレスのようです。これらのアカウントがボットである唯一の兆候は、多くのユーザーがプロフィールで同じバナー画像を再利用していること、および一般的な「私は学生です」という自己紹介テキストです。

これらの登録に関連付けられているメールの例を以下に示しますが、文字/数字を変更して匿名化しました。

  1. syedaleem435@gmail.com
  2. kksam362@gmail.com
  3. julik8641@gmail.com
  4. eishanihal253@gmail.com
  5. subir2426@gmail.com
  6. meeagle38103@gmail.com

これらのユーザーは登録後、私たちのコミュニティに関連のない新しいトピックを作成しています。多くの場合、これらのトピックは単語にすらなっておらず、まるで幼児がキーボードを叩いたかのようです。トピックの検出と削除はそれほど難しくありませんが、より悪質なのは、既存のトピックにスパム/低品質のコンテンツをスパムすることです。私たちの人気のあるトピックの多くに、500から1,500の新しいスパム/低品質の投稿が追加されています。

現在、登録を完全に無効にしていますが、以下の点について支援を求めています。

  1. メンバーを一括で削除する方法はありますか?過去72時間に登録されたすべてのTL0ユーザーを削除できますか?
  2. スパム/使い捨てメールを検出して、それらの登録を拒否する方法はありますか?現時点では、一時的に末尾が3〜5桁の数字で終わるすべてのメールをブロックしても構いません。
  3. 自動サイレンスを3000ミリ秒より大きい値に設定することをお勧めしますか?
  4. 大量のスパムに対処するための他のヒントやトリックを教えていただけますか?ここ2〜3日、これはフルタイムの仕事のようになっていると感じています。Akismetを使用していますが、役立つ追加のプラグインはありますか?
「いいね!」 5

少なくとも一時的に、すべてのカテゴリの作成/返信をTL1、あるいはTL2に設定するか、カスタムウィザードを使用して新規ユーザーにいくつかのハードルを越えさせる(「報酬は受け取らないことを理解しました」という10個の選択肢のうち、正しいものが1つだけある)ことで、投稿できるグループに追加することを推奨します。

「いいね!」 4

サインアップページに、複数の回答があり、そのうち1つだけが許容されるカスタムユーザーフィールドと必須の複数選択オプションを使用することを試すことができます。これにより、ボットの速度が少し低下するか、少なくとも無効なサインアップを削除するのに役立つ簡単にフィルタリングできるフィールドが得られます。(注意:これについて考えた後、特定の回答を要求するものが何もないため、これは機能しないと疑っています。以前の回答の方法の方がうまくいくかもしれません。)

現在、キャプチャタイプのトラップは効果がないと感じています。ボットは私よりも速くそれを解決できます。

Railsで新しいL0ユーザーを削除する方法があるはずですが、最初に必ずバックアップを作成してください。投稿している場合は、まずそれらの投稿を削除する必要があります。

サインアップに2要素認証IDを要求することが、スパマーをほぼ排除したと他の人が言っています。私はまだそこまでしなくても大丈夫です。

「いいね!」 6

これまでのご返信に感謝いたします。

登録を1日無効にしたことで、なんとか状況を改善することができました。

@RGJ グループへの追加と投稿権限の付与に際して、いくつかのハードルを設けるというあなたのアイデアは良いですね。これを検討することにします。

データエクスプローラーを使用して、これまで見過ごされていた約5,000件のボットアカウントを特定することができました。

@MikeNolan Railsコンソールへのアクセス権があるかどうかはまだ不明です。私たちはDiscourseと直接ホスティング契約をしており、購入・オンボーディングプロセスには関わっていなかったため、どのようなアクセス権があるかを確認するために、この件を上司に確認しています。

API経由でも削除を実行できると考えてよいでしょうか?簡単にAPI認証情報を作成できることがわかりました。

以下のようなスクリプトです。

import csv
import requests
import time

api_key = 'api_key'
api_username = 'api_username'
base_url = 'https://mydomain.com'
headers = {
    'Api-Key': api_key,
    'Api-Username': api_username
}

def delete_user(user_id):
    delete_url = f'{base_url}/admin/users/{user_id}.json'
    response = requests.delete(delete_url, headers=headers)
    
    if response.status_code == 200:
        print(f'Successfully deleted user {user_id}')
    else:
        print(f'Failed to delete user {user_id}. Status code: {response.status_code}, Response: {response.text}')

with open('user_ids_to_delete.csv', 'r') as csvfile:
    reader = csv.reader(csvfile)
    for row in reader:
        user_id = row[0]
        try:
            delete_user(user_id)
        except Exception as e:
            print(f'Error occurred while deleting user {user_id}: {e}')
        
        time.sleep(1)  # サーバーへのリクエスト過多を避けるために遅延を追加
「いいね!」 1

数年前、私たちの古いフォーラム(phpbb3)は大量の偽登録に見舞われました。メールの多くはあなたがリストしたgmailのものに似ていましたが、.ruアドレス、特にyandexからもかなりの数が届きました。

一時は1日に1000件も届いていました。それを制御下に置いたときには、80,000件以上の偽レコードがありました。

この問題は、有効な現在の会員ID(私たちの会員システムは完全に別でした)を要求し、それがフォーラムレコードを作成するために既に使用されていないものにする、という方法で解決しました。これにより、たとえ誰かが私たちの会員記録(オンラインです)にアクセスできたとしても、IDは一度しか使用できませんでした。偽登録は実質ゼロにまで減少しました。

データエクスプローラーは十分に使い込めていないため、その制限についてはわかりません。私は20年以上postgresql DBAをしてきたので、psqlに直接アクセスすることは問題ありませんでしたが、そこでの活動は読み取り専用クエリに限定していました。

「いいね!」 3

フィンガープリンティングはまだ有効な技術なのでしょうか、それともブラウザによってほとんど無力化されてしまったのでしょうか?

「いいね!」 1

正しい質問は、それがかつて実行可能な技術だったかどうかです :wink:

(そして、念のためお知らせしますが、EUでは違法です)

railsから (docker exec -it my_container rails c):

spammers = User.where(trust_level: 0).where("created_at > ?",  Date.today - 3)
puts "found #{spammers.length} spammers"

destroyer = UserDestroyer.new(Discourse.system_user)
spammers.each do |spammer|
  destroyer.destroy(spammer, delete_posts: true)
end

スパム防止のみに使用され、ユーザー行動の追跡には使用されない場合、GDPRによって「正当な利益」として許可されます。

「いいね!」 1

そして、身元不明のまま使用するにはどうすればよいでしょうか?

「識別」とはどういう意味か分かりません。

もしあなたが私のフォーラムのユーザーで、私があなたを禁止した場合、フィンガープリンティングプラグインを使用して、あなたが別名で新しいアカウントを作成したことを確認できるため、そのアカウントも禁止できます。その場合、私は単にフォーラムの所有者としての私の利益を守るためにフィンガープリンティングを使用しています。私はあなたに何かを販売しているわけでもなく、あなたのプライバシーを不必要に侵害しているわけでもありません。これは、IPアドレスを保存して比較するのと同じように機能しますが、プロキシやVPNを使用すると簡単に変更できるという点が異なります。

「いいね!」 2

フィンガープリンティングプラグインツールのトピックにあるコメントは、フィンガープリンティングとEUの合法性について、あなたと完全に同意しない可能性があります。

幸いなことに、現在、フィンガープリンティングが有用なスパム対策策となりそうなサイトは持っていません。

「いいね!」 1

新規ユーザーの承認を有効にすることを検討しましたか? コミュニティに、新規メンバーはメールリンク招待が必要であることを伝えることもできます。

もしそのYouTuberが引き続き問題である場合は、動画にフラグを立て、YouTubeに苦情を申し立ててください。

「いいね!」 1

ループバックしてこれを締めくくるために - これはPM経由でフォローアップされ、解決されました。 :partying_face:

しかし、同様の状況にある方のために、マネージドホスティングのためレールコンソールにアクセスできない場合でも、APIを使用してユーザーを削除できます。 :+1:

「いいね!」 1