Google reCAPTCHAv3를 Ruby On Rails에 넣어보세요~

14273 단어 reCAPTCHA
이른바 ReCAPTCHA
BOT 등 악의적으로 사이트를 방문하지 않도록 보호하기 위한 기능이다.
V2에 대해서는 다음 기사를 참조하십시오.
https://qiita.com/amagasu1234/items/9760c2c410776fd02e12
이번에는 RubbyOnRails 환경에 ReCAPTCHAV3를 추가했습니다.
설명
V1
비뚤어진 문자를 읽고 입력을 통해bot이 아니라는 것을 확인합니다.2018년 3월 서비스 종료

V2
이미지를 선택하여 사람과 로봇을 판단한다.

V3
V1/V2와 달리 사용자가 입력하지 않아 방문의 인성화된 득점치(0.0~1.0)를bot으로 판별합니다.2018년 10월 29일 서비스 시작

개발 환경
rails: 5.1
macOS Mojave
IDE: RubyMine
이번 테스트원은 아래의 rails 강좌를 바탕으로 실시되었으며 상세한 내용은 아래 링크를 참조하시기 바랍니다.
https://railstutorial.jp
로그인 화면에서reCAPTCHA를 테스트하기 위해 다음 rails 튜토리얼의 Open 원본을 사용했습니다.
https://github.com/yasslab/sample_apps
작업 단계
  • Google reCAPCHA 관리 콘솔에서 사이트 키 및 비밀 키 가져오기
  • 제목에reCAPTCHA 스크립트 추가
  • 로그인 양식에 Hidden
  • 추가
  • 서버 측면 설치
  • 구글reCAPCHA 관리 콘솔
    새 등록
    아래 링크에서 다시 로그인하면 사이트 열쇠와 비밀 열쇠가 발행된다는 것을 명심하세요.
    https://www.google.com/recaptcha/admin/create

    등록 완료
    등록이 완료되면 다음과 같은 불법청구 상황을 확인할 수 있는 관리사이트를 추가했다.

    머리글에 reCAPTCHA 스크립트 추가
    application.html.erb
    <script src="https://www.google.com/recaptcha/api.js?render=reCAPCHAサイトキー"></script>
    <script>
            grecaptcha.ready(function () {
                grecaptcha.execute('reCAPCHAサイトキー', { action: 'contact' }).then(function (token) {
                    var recaptchaResponse = document.getElementById('recaptchaResponse');
                    recaptchaResponse.value = token;
                });
            });
    </script>
    
    로그인 창에 추가
    로그인 화면에 추가<input type="hidden" name="recaptcha_response" id="recaptchaResponse">sessions/new.html.erb
    <% provide(:title, "Log in") %>
    <h1>Log in</h1>
    
    <div class="row">
      <div class="col-md-6 col-md-offset-3">
        <%= form_for(:session, url: login_path) do |f| %>
          <%= f.label :email %>
          <%= f.email_field :email, class: 'form-control' %>
    
          <%= f.label :password %>
          <%= link_to "(forgot password)", new_password_reset_path %>
          <%= f.password_field :password, class: 'form-control' %>
    
          <%= f.label :remember_me, class: "checkbox inline" do %>
            <%= f.check_box :remember_me %>
            <span>Remember me on this computer</span>
          <% end %>
          <input type="hidden" name="recaptcha_response" id="recaptchaResponse">
    
          <%= f.submit "Log in", class: "btn btn-primary" %>
        <% end %>
    
        <p>New user? <%= link_to "Sign up now!", signup_path %></p>
      </div>
    </div>
    
    서버측 설치
    SessionsController
    require 'uri'
    require 'net/http'
    
    class SessionsController < ApplicationController
    
      RECAPTCHA_SECRET_KEY = 'reCAPTCHAコンソールからシークレットキーを入力'
      RECAPTCHA_SITEVERIFY_URL = 'https://www.google.com/recaptcha/api/siteverify'
    
      # POST /login
      def create
        # siteverifyAPIを呼び出してボットかチェック
        siteverify_uri = URI.parse("#{RECAPTCHA_SITEVERIFY_URL}?response=#{params[:recaptcha_response]}&secret=#{RECAPTCHA_SECRET_KEY}")
        response = Net::HTTP.get_response(siteverify_uri)
        json_response = JSON.parse(response.body)
    
        # reCAPTCHAのレスポンスデータが成功かスコアが0.5以上なら人間のアクションだと判断
        # スコアについては運用中変更する必要がある
        if json_response['success'] && json_response['score'] > 0.5
          user = User.find_by(email: params[:session][:email])
          if user && user.authenticate(params[:session][:password])
            if user.activated?
              # Success
              log_in user
              params[:session][:remember_me] == '1' ? remember(user) : forget(user)
              redirect_back_or user
            else
              message  = "Account not activated. "
              message += "Check your email for the activation link."
              flash[:warning] = message
              redirect_to root_url
            end
          else
            # Failure
            flash.now[:danger] = 'Invalid email/password combination'
            render 'new'
          end
        else
          flash.now[:danger] = '不正アクセスです。'
          render 'new'
        end
      end
    
    end
    
    
    siteverify API가 회신한 score가'1'에 가까운 것은 인간의 움직임이고,'0'에 가까운 경우는bot의 가능성이 높다는 뜻이다.
    이 경우에만 Google reCAPTCHA는 화면에서 작업을 모니터링할 수 있습니다.
    다음 화면의 오른쪽 아래에 reCAPTCHA로 보호된 화면이 표시됩니다.

    3명의 계정을 미리 등록하고 계정을 바꿔 로그인하면 최초 로그인에 성공한 사용자를 제외한 계정은 로그인할 수 없다.
    총결산
    이렇게 간단하게bot에서 사이트를 보호할 수 있다는 것은 정말 대단하다. 문제를 얼마나 정확하게 판단할 수 있겠는가.
    이번엔 시행만 해보고, 다음엔 캐피바라를 활용해 테스트를 해보자.

    좋은 웹페이지 즐겨찾기