読者です 読者をやめる 読者になる 読者になる

カッパでも分かるiOSアプリゲーム開発

カッパがひたすらゲーム制作に関することを書くブログです。Railsに関するTipsもたまにまとめてます。

運営していた攻略 wiki がスパム攻撃されたのでキャプチャ認証を導入

スポンサードリンク

Ruby on Rails 5アプリケーションプログラミング

f:id:InvokeTwoA:20151023183618p:plain「た、大変だー」
f:id:InvokeTwoA:20151215172640p:plain「どうしましたカッパさん(どうせまたくだらないゴシップニュースなんだろうなー)」
f:id:InvokeTwoA:20151023183618p:plain「我々の攻略wikiが荒らされてるゥー!」
f:id:InvokeTwoA:20151215172640p:plain「!?」
f:id:InvokeTwoA:20151023183618p:plain「一夜にして200ページが荒らされた……このままでは我々のサイトがNTRされてしまう!」

攻略 wiki をしてるとスパムが定期的にやってくる

  • ページ内を誰でも編集できるようにする -> 圧倒的な情報量こそが wiki の強み
  • しかしページ編集の一般公開はスパムの格好の餌食となる

対策1: NGワードを設定する

f:id:InvokeTwoA:20151023183618p:plain「しかしサイト運営を続けているとあまりにスパムの量が多すぎて、NGワードだと対応できなかったりもする」
f:id:InvokeTwoA:20151215172640p:plain「なかには全く読めない文字のスパムだったりしますもんね」
f:id:InvokeTwoA:20151023183618p:plain「あと、この対応だと基本的に後手に回る感じなので手遅れなんだよね」

  • NGワード対応は結構微妙
  • 例えば「エロ」をNGにしたら「ヒエログリフ」という入力もNGになってしまうので一般ユーザーの情報提供(超大事な資産)もNGにしてしまうリスクがある
  • NGワードが多すぎてキリがない

対策2: IP制限をかける

f:id:InvokeTwoA:20151023183618p:plain「……スパム元が多すぎてキリがないや」
f:id:InvokeTwoA:20151215172640p:plain「特定個人から身を守るには有効なんですけどねー」

  • この世界は定期的にスパムが襲いかかってくる地獄
  • ダークソウルかよ

対策3: reCAPTCHA による画像認証を導入する(これが最高)

f:id:InvokeTwoA:20151023183618p:plain「スパムはその殆どがスクリプトによる自動投稿」
f:id:InvokeTwoA:20151215172640p:plain「1分間に100件とかコメントしてきますもんね」
f:id:InvokeTwoA:20151023183618p:plain「なので入力フォームでよく見る あなたがロボットかどうか確認しまーす 画像を導入する事にしたよ」
f:id:InvokeTwoA:20151215172640p:plain「おお!」

神の技術 reCAPTCHA とは

reCAPTCHAとは、ウェブサイトの制限エリアへのアクセスを試みるボットからサイトを防御するためCAPTCHAを利用するのと同時に、そのCAPTCHAに対する返答を紙の本のデジタル化に活かすシステムである。 オリジナルは2007年にカーネギーメロン大学ピッツバーグ本校にて開発された。

f:id:InvokeTwoA:20151023183618p:plain「Googleさんの技術ならば問題ないよね」
f:id:InvokeTwoA:20151215172640p:plain(で、でたー! カッパさんの google への盲信)
f:id:InvokeTwoA:20151023183618p:plain「しかも丁寧に Rails 用に gem まで用意してくれている」
f:id:InvokeTwoA:20151215172640p:plain「やったー! これで思考停止で bundle install するだけで導入できるぞー!」
f:id:InvokeTwoA:20151215172640p:plain(で、でたー! 脳死 gem installer)

Rails + recaptcha の導入

事前準備

  • 下記ページにて、 google アカウントでサイト登録をして site_key, secret_key を発行する

https://www.google.com/recaptcha/admin#list

  • Rails の config にこれらのキーを登録する
  • そのまま github に登録するのは危険なので、今回は heroku の環境変数にセットする
heroku config:set RECAPTCHA_SITE_KEY=“6Lc6BAAAAAAAAChqRbQZcn_hogehogehogehogehoge” RECAPTCHA_SECRET_KEY=“6Lc6BAAAAAAAAKN3DRm6VA_hogehogehogehogehoge”

Rails プロジェクトに導入

gem "recaptcha", require: "recaptcha/rails"
||< 
- 導入したい入力フォームに  recaptcha_tags を入れる

>||

= form_for @hoge do |f|
  = # なんか入力情報
  = recaptcha_tags
  = # なんか入力情報
  • 入力パラメーターを処理するロジック部分に recaptcha のチェックロジックを導入(公式のサンプル)
# app/controllers/users_controller.rb
@user = User.new(params[:user].permit(:name))
if verify_recaptcha(model: @user) && @user.save
  redirect_to @user
else
  render 'new'
end

導入した結果は?

f:id:InvokeTwoA:20151023183618p:plain「さて……これから導入するかー!」
f:id:InvokeTwoA:20151215172640p:plain「!?」
f:id:InvokeTwoA:20151023183618p:plain「じつは我々のサイトは現在絶賛荒らされ中で、更に仕事中で動けない状態なんだ。まだ導入していないんだよ!」
f:id:InvokeTwoA:20151215172640p:plain(ニワカ記事をアップするとは、かっぱさんのメンタルは戦国武将レベルか)
f:id:InvokeTwoA:20151023183618p:plain「なので帰宅したら即対応できるよう対応内容をメモしておいたのさヒャッハー」

  • 果たしてカッパはサイトを守る事ができるのか
  • データの一斉バックアップ機能がないので、1ページずつ手動で直すと思うと辛い

そしてカッパはスパムへの憎しみと共に、自分自身がスパムになってはいけないという教訓を学んだのでした