スパム投稿が1時間あたり約30件あったサイトの復旧を手伝いました。AIスパムを有効にしましたが、既存の投稿の問題は解決しませんでした。そこで行ったことを紹介します。皆さんのサイトでも役立つかもしれません。皆さんのサイトでテストしたわけではないので、これらのいずれかを行う場合は、必ずバックアップを取得し、AIがサイトを乗っ取ろうとしているように見えないように注意してください。
これは、Railsについて知っており、それを実行する方法を知っていることを前提としています。そうでない場合は、これを行うべきではありません。
まず、サイトをDiscourseの読み取り専用モードに設定し、ひどい間違いを犯している間に他の人がコンテンツを作成しないようにします。次に、バックアップを作成します。これにより、読み取り専用モードをオフにするまで、バックアップに安全に戻ることができます。
最近の投稿を取得する
攻撃は1日強前に始まったので、2日前まで遡りました。より具体的にしたい場合は、36.hours.agoのようなこともできます。もっと賢ければ、PMの投稿をスキップするようなことをしたかもしれませんが、私は気にしないことにしました。
posts = Post.where("created_at >= ?", 2.days.ago)
.where(deleted_at: nil)
.where("user_id > ?", 1)
これらの投稿にSpamScannerを呼び出す
一部の投稿が失敗した原因はよくわかりませんが、いくつか「おっと」という結果が出ても、おそらく心配する必要はありません。
posts.each do |post|
begin
puts "https://talk.commonmark.org/p/#{post.id}"
DiscourseAi::AiModeration::SpamScanner.perform_scan(post)
rescue
puts "oops";
end;
sleep 0.2;
end
レビューが必要な投稿を取得する
これは、レビュー可能な投稿としてマークされた(おそらく上記の操作によって)投稿を取得します。この危険な冒険に関係のないものに、無差別に適用することは避けたいです。
reviewables = Reviewable.where(status: "pending")
.where(potential_spam: true)
.where("created_at >= ?", 1.hour.ago)
.where("updated_at >= ?", 1.hour.ago)
AIを無条件に信頼する
もちろん、非表示になったトピックを注意深く確認し、それらがすべて本当にスパムであったように見えたので、そのまま進むことにしました。見出しはジョークです。あなたは本当にAIを無条件に信頼しているわけではないですよね?!?!?
これは投稿を削除し、ユーザーを削除してブロックします。非常に危険です。
reviewables.each do |reviewable|
begin
puts "deleting https://talk.commonmark.org/t/#{reviewable.topic_id}"
if reviewable.topic.nil?
puts "already gone"
next
end
reviewable.perform(user, :delete_user_block)
rescue
puts "oops"
end
end