reCaptcha v3

reCaptcha v3 không yêu cầu người dùng “xem hình đoán chữ” hay làm gì đó để giúp phân biệt người và robot. Nó tự động thu thập các thao tác chuột, phím và nhiều thứ khác rồi chấm điểm. Điểm gần 0 thiên về robot, điểm gần 1 thiên về người.

reCaptcha v3 gắn một logo ở góc dưới bên phải của trang web có sử dụng dịch vụ này.

Trang web muốn dùng reCaptcha của Google phải có tài khoản gmail để đăng ký. Đăng ký xong sẽ có client_key và server_key để kết nối với reCaptcha của Google, ngoài ra còn phải chỉ rõ website nào dùng reCaptcha trong phần Settings.

  • client_key dùng ở client, trong thẻ html và đoạn mã javascript
  • server_key dùng ở server để lấy điểm của người dùng từ dịch vụ reCaptcha.

Đoạn mã reCaptcha dùng ở client khác nhau ở v2 và v3, trong khi đoạn mã dùng ở server không thay đổi.

Thí dụ về sử dụng reCaptcha v3

Giả sử ta đã thiết kế 2 trang web để gởi và xử lý dữ liệu, chưa dùng reCaptcha:

<!-- send.html //-->
...
<form id=“myform” method="POST" action="receive.php">
  ...
  <button type="submit" name="submit">Submit</button>
</form>
// receive.php
<?php
// xử lý dữ liệu
...
?>

reCaptcha v3 gán vài đoạn mã đơn giản vào cả 2 file client và server ở trên

<!-- send.html //-->
...
  <script src="https://www.google.com/recaptcha/api.js?render=CLIENT_KEY"></script>
</head>
...
<form id=“myform” method="POST" action="receive.php">
  ...
  <input type="hidden" name="gToken" />
  <button type="button" onclick="getToken()">Submit</button>
</form>
<script>
  function getToken(){
    grecaptcha.ready(function(){
      grecaptcha.execute("CLIENT_KEY",{action:""}).then(function(token){
      f=document.getElementById("myform")
      f.gToken.value = token;
      f.submit();
    });
  });
}
</script>

Nghĩa là thêm vào một dòng trước thẻ </head> và một dòng trước thẻ button. Ngoài ra sự kiện click của button trỏ đến một hàm javascript dùng để lấy token cho phiên làm việc, từ dịch vụ reCaptcha. Riêng thuộc tính action dùng để phân biệt các form khác nhau, nếu không cần dùng thì cho giá trị rỗng.

// receive.php
<?php
$token=(isset($_POST['gToken']))?$_POST['gToken']:'';
$response=json_decode(file_get_contents("https://www.google.com/recaptcha/api/siteverify?secret=SERVER_KEY&response=$token&remoteip=".$_SERVER['REMOTE_ADDR']));
// Nếu là người...
if ($response->success === true && $response->score > 0.5) {
  // xử lý dữ liệu
  ...
}
?>

Ở 2 dòng đầu, script lấy token ở $_POST[‘gToken’] rồi dùng cùng với SERVER_KEY để hỏi google đánh giá phiên làm việc vứa rồi là do người hay máy. Kết quả trả về là một chuổi json, được giải mã để lấy success score. Ở đây chúng ta xem score > 0.5 là người.

  • Trên đây chúng ta lấy token ngay tức thì trước sự kiện submit nên không bị trở ngại do token của reCaptcha chỉ có hiệu lực trong 2 phút.
  • Không thể cài đặt đoạn mã lấy token trong onSubmit vì nó hoạt động kiểu promise, có thể chưa kết thúc trước khi form được submit.
  • Mỗi tài khoản sử dụng reCaptcha được miễn phí 2 triệu lần gọi dịch vụ reCaptcha trong một tháng.
  • reCaptcha v3 luôn luôn kết nối với server của nó, và thu thập những gì chúng ta không biết. Google bảo đảm chỉ thu thập những dữ liệu cần thiết để reCaptcha hoạt động, tất nhiên cho đến khi có sự cố gì đó cho thấy điều ngược lại.
  • Captcha dùng kiểu “xem hình đoán chữ” đã trở nên lạc hậu và dễ vượt qua, do kỹ thuật OCR quét hình ra chữ đã rất chính xác, cho dù chúng ta dùng font chữ mảnh hay liên tục đảo màu nền với màu chữ…

Comments Off on reCaptcha v3

Filed under Software

Comments are closed.