Main Content

webキャンペーンの不正投票と向き合う

とあるwebキャンペーンの人気投票コンテンツを期間限定で運用してたんですけど、不正投票マンとのいたちごっこバトルを毎晩続けた結果、Firebase の無料割り当て枠(読込:5万回/日)を突破され仕方なく従量課金することになり、技術者として敗北感を味わいました。

その後、毎分連続の多重投票を無効とするトラップを深夜3時にアップデートして、そのまま無事にキャンペーンは終了しましたが、その間はずっとbotからのアクセスが止まず、とてもスリリングでした。

いろいろ調べては都度対応して、俺もちょっとだけ賢くなれた気もするけど、もしまた同じような案件があったときにはもっとうまくやりたいので、このあたりの最適解は知っておきたい。

ということで振り返ってまとめてみる。

過去にやられてきたキャンペーンサイトたち

ネット上では、過去にいろんなキャンペーンが不正投票の餌食になってきました。

いやー、こういう祭りにネット民として参加する側だったならウッキウキなんですけれど、逆に自分が運営側だったらもうめちゃくちゃ嫌ですね、敵に回したくない(笑)

ここで、ネット民を恐れるあまり、ガチガチに制限を設けて認証を強固にするということは、同時に参加への手間も増えてしまい、誰も投票してくれなくなって、それはそれでキャンペーンコンテンツとしても盛り上がらないというジレンマもあるわけで、これは悩ましい問題ですよね。

どうすればよいのか。

グーグる

質問内容バッチリなのがヒットしました。

  • 既に投票したIPアドレスからの投票を拒否する。
  • Cookieでの制限をする。
  • ユーザーエージェントで判断する。
  • reCAPTCHAを使う。
  • Proxy経由での投票を拒否する。
  • 海外ホストからの投票拒否。
  • CSRF対策, Refererの判定。

この質問エントリーを読んで、ほぼ答えが出たようなもんなんですけれど、結論は「ほぼ不可能」ということで納得はしました。

ネット民対策のせいで一般ユーザーが離脱してしまってはいけませんし、総選挙のような厳格な投票でない限りは、ある程度の不正には目を瞑るしかなさそうです。

不正のやり方

不正のやり方についても軽く調べました。
こちらのブログと、こちらのブログに詳細が書いてあったんですけれど、スマホの『機内モード』『モバイルデータ切り替え』『シークレットウィンドウ』あたりをガチャガチャ駆使してやるそうです。なるほどですねー。

対策まとめ

できる範囲の対策として有効なのは、結局「不正の効率が悪い投票方法にすること」でしょうか。

  • (1)
    例のぐにゃぐにゃの文字を読み取ってもらったりと、投票までに何ページか経由させる手間を課す。
  • (2)
    同一IPアドレスからの同時接続数を制限すると、不正ツールやbot対策に効きそう。
  • (3)
    メールかSNS経由でログインさせ、それを本人認証とすること。
    メールだって量産できなくはないですが取得がめんどそうなので。
  • (4)
    素直に1クリック=1ポイントとせずに、DBに貯めた投票データを評価してポイントを算出する。
    例えば、怪しげな規則的連続投票を検知して除外したり、任意の時間帯で有効とする票の上限を決めておくなど、有効票と判断できなかったものはカウントしないなど。
  • (5)
    ペナルティを設ける。
    不正がひどい場合は、減点して容赦なく見せしめる。がんばって不正した人が報われずにやる気をなくしたらいいんだけれど。
    ただ、これはライバルを蹴落とすためにあえてペナルティを狙う人がいるかもしれませんが。
  • (6)
    最後の手段、神の采配。
    神=クライアント様の意図しないすべての投票がなかったことに!
    もしくは、審査員の特別票として最後に+1000票させるとか。出来レース。

いずれの方法も、善良な票を無効化してしまう可能性はもちろんありますが、ツールで突撃連打されるよりかはマシという妥協案でした。しょうがないっす。

余談:ネット選挙について

話は変わって、現実世界の総選挙でネット投票はなぜ実現できないのかについて。こっちはこっちで別の問題がありました。

> 「誰にも強制されず、自由な意思で投票できるのか」

投票システムの不正とかセキュリティの話というよりかは、それ以前の問題でした。
時間も場所も制限されない、なんだったら本人が操作している保証もないので、「本人の意志で投じた票であるか」の判定ができないのです。

いやー難しい問題ですね。でも早く実現するといいですね。賢い人がんばってください。おしまい。

Comments

No comment yet.

Compose Comment