1日1回投票システムを考える



この土日で知ったのですが、6月にこんなことがあったようです。
ウイダーinゼリーの投票キャンペーンで起きた大いなる悪ノリを、主催者は予想できなかったのか[Yahoo ニュース]

Youtubeに不正のやり方が動画になっていて、このやりかたで掲示板の方々が一斉に投票をしたようです。
母校にinゼリーで一日に何度も投票する方法 [youtube]

やり方は以下の通り(スマホ)
1.プライベートウィンドウやシークレットモードで該当の高校のページを開く
2.「投票」でポップアップが開く
3.投票する
4.投票されたことが分かる(投票済みですと表示される)
5.タブを閉じてコピーしておいた高校のページのURLをペーストしてもう一度開く
6.ポップアップを表示
7.機内モードOnしてOff
8.投票するボタンを押す
9.2票目が投票されていることが分かる
10.またブラウザのタブを閉じて、5から繰り返し

という感じのようです。僕が見たときはキャンペーンが終了しており(Yahooニュースで知ったし)、実際の動作は分かりませんがポップアップ表示前でも機内モードをOnOffして順序多少変わってもいけそうな気がします。機内モードで保存されたキャッシュをクリアしてるっぽいですね。つまり新しく訪問したユーザとして繰り返し認識されてしまっています。

記事にもあるように森永製菓様も誰も得しないですね。「様」とつけたのは森永製菓様がうちの取引先だからです。お金もかかったろうし悲しいなぁと思います。そこで今日は実際にこの1日1回の投票システムをうちが作る場合、どうしたら良いかをアピールを兼ねて考えたいと思います(誰にだ)。

まず第一に考えなければいけないのは何をもって不正とするかです。1日1回と言っているのは普通に考えて1人1日1回ですが、どこまで厳密にこの原則に従うかにもよると思います。それによってテストパターンや必要となる手順なども変わります。例えばきっちり1人1回だ!ってことにするなら住所や電話番号(もしくはマイナンバーなど)を登録してもらい会員だけしかできないようにしたりします。端末を複数持ってたり電話番号を複数持ってたりする場合はどうするかなども考える必要があります。でも今回は広告も兼ねていると思いますので会員登録は微妙でしょうし、複数端末はセーフラインなのかなと思います。

次に、どこまでを許容するかです。どのような投票を許すかがあたります。今回は特にポップアップでUIを良くしている反面、不正のパターンが見つかれば簡単に拡散できてしまいます。ちょっと面倒になるかもしれませんが、1画面かましたほうが良いと思います(キャプチャシステムもあり)。またシークレットウィンドウでの投票を可能としているため、SessionStrageなどで投票者の情報を保持し続けることができません。今回のケースの場合、各ページのURLにはサーバ側の1回だけのハッシュIDをURLパラメータとして付与しワンタイムトークンもhiddenにいれたらコピペは出来ません(最初から手順を踏まないといけなくなる)。それから同じページ(ドメイン)を別タブで開けないようにしたほうがいいですね。ページを開いたら情報を保持し複数タブで開いていたら1回目の投票だけ有効にする感じでしょうか(Windowのblurとか)。これは別件のAKB選挙の不正投票の件の対策でもあります。最後に集計結果もすぐに反映せずバッチで1日1回集計された方が良さそうです。同一のIPアドレスでめっちゃ投票があればチェックしたりできます。リジェクトできるため炎上を防げますし企業や団体などでの集団投票も防げます(投票数が少なくなるし賛否ありそう)。

それでも完全に防ぐのは難しいですね。個体識別番号は推奨されてませんし。
1.Cookieが投票したかのチェック→Cookie削除して再投票または複数のブラウザをインストール、Cookieを切り替え。
2.IPでチェック→回線をつなぎ直してIP取得しなおしが可能。企業で呼びかけたりできない。
3.メールアドレスでチェック→100個取ったら?
って感じで、参加者は電話番号を登録しシリアル番号を発行してとかにしてもある程度の不正は可能そうです。手軽にしつつ遊ばれないようにするっていうくらいでしたら可能だと思いますが。ただ、あんまりここに予算もさけられないですよね。

今回は色々調べてみると札幌の高校が炎上前からかなりの投票を集めていたのも火をつけた原因のようですので運用も考えなければいけませんが、正直なところ「ここまでする必要があるのかな」と思います。高校生にウィダーあげようよって企画なわけですし。ジレンマも多いし色々と考えてしまいますね。