Google reCAPTCHAv3를 Ruby On Rails에 넣어보세요~
14273 단어 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
작업 단계
새 등록
아래 링크에서 다시 로그인하면 사이트 열쇠와 비밀 열쇠가 발행된다는 것을 명심하세요.
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에서 사이트를 보호할 수 있다는 것은 정말 대단하다. 문제를 얼마나 정확하게 판단할 수 있겠는가.
이번엔 시행만 해보고, 다음엔 캐피바라를 활용해 테스트를 해보자.
Reference
이 문제에 관하여(Google reCAPTCHAv3를 Ruby On Rails에 넣어보세요~), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/HavenSpring/items/98fa8960746c944b6e8c텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)