Hoàng Web

Thiết Kế Website WordPress

  • Kho giao diện
  • Dịch Vụ
    • Thiết kế web giá rẻ
    • Thiết kế website WordPress
    • Hosting Miễn Phí 100GB
    • Tích hợp thanh toán MoMo, ViettelPay, Vietcombank, MB..
    • Tối ưu Google PageSpeed
    • Sửa lỗi nâng cấp website
    • Viết plugin WordPress
    • Code Tool theo yêu cầu
  • Bảng giá
  • Quy trình làm việc
  • Giới thiệu
  • Liên Lạc
Trang chủ » Programming » PHP » Tạo form bảo mật với captcha chống auto spam trong php

Tạo form bảo mật với captcha chống auto spam trong php

Thứ Sáu, 15/08/2014 by Hoàng Quách

Nội dung

  • 1 Tạo captcha sử dụng re-captcha
    • 1.1 Quy trình sử lý captcha
    • 1.2 Đăng ký Re-Captcha
  • 2 Tích hợp re-captcha
    • 2.1 Sử dụng iFrame
    • 2.2 Sử dụng javascript
    • 2.3 Tạo re-captcha với PHP
  • shares
  • Facebook
  • Facebook Messenger
  • Gmail
  • Viber
  • Skype

Tính năng tạo captcha giúp website tránh spam cơ sở dữ liệu một cách hiệu quả nhất nếu bạn đang cung cấp dịch vụ cho người dùng. Bạn có thể đính captcha vào form đăng ký thành viên hoặc mỗi lần giao dịch ở trên web. Có nhiều cách để triển khai captcha cho website và mình đã tìm được một vài đoạn code thậm trí thư viện chuyên làm captcha, trong số đó được cư dân mạng bình chọn tốt nhất là re-Captcha của google.

Những bạn học về web có thể tìm đọc trên diễn dàn cách làm captcha, thực hiện từng bước bắt đầu từ việc làm các đoạn mã sinh ra hình captcha. Trong PHP có hẳn một tutorial giúp bạn tạo image từ text đó nhé, nhưng muốn sử lý ảnh phức tạp hơn để các phần mềm khác không quá dễ đoán chữ captcha trong ảnh thì phải cần đến hỗ trợ của thư viện ngoài. Hoặc sử dụng font chữ nghệ thuật cũng là một ý kiến hay :D.
tạo captcha cho website

Tạo captcha sử dụng re-captcha

Trong bài này mình sẽ nói chi tiết các bước tạo re-captcha tích hợp cho mọi website. Ok, chúng ta hãy bắt đầu nhé.

Quy trình sử lý captcha

Re-captcha là một web service, nghĩa là hình ảnh captcha bạn nhìn thấy được quản lý bởi google và hiển thị đến người dùng. Các bước người dùng có thể vượt qua captcha:

  1. Captcha được tải ngay sau khi user load trang xong.
  2. Người dùng nhập chữ xuất hiện trên hình vào textbox
  3. Nhấn nút submit trên form có captcha, sau khi re-captcha đã tải xong nó sinh ra mã challenge và một mã user điền khớp với hình. Căn cứ vào 2 mã này để xác nhận và cho form sử lý tiếp.

Đăng ký Re-Captcha

Đăng ký re-captcha cũng rất đơn giản, bạn truy cập vào https://www.google.com/recaptcha, sau đó ấn vào Get reCAPTCHA. Nhấn tiếp Sign up Now. Bước này, bạn điền tên domain vào mục Domain, mỗi domain cách bởi dấu phẩy. Google Re-captcha sẽ sinh ra API Key, quá trình tích hợp re-captcha vào web sẽ sử dụng đến thông tin này. Chú ý: tên domain chỉ để nhớ thôi không quan trọng nhưng cũng nên đặt tên domain đúng giúp bạn quản lý tốt hơn đặt tên bừa bãi sẽ rất dễ xóa nhầm domain đang sử dụng re-captcha.

Lưu ý: tên domain không phải URL schema nha. Ví dụ: hoangweb.com, khosachnoi.net

Không được điền: “http://hoangweb.com”
Nhấn Create để tạo api.

Danh sách các trang web đã đăng ký sử dụng xuất hiện ở bên dưới, nếu muốn thêm các domain khác thì ấn lại vào Add a new Site. Chọn vào trang web sẽ tích hợp.

đăng ký re-captcha

Tích hợp re-captcha

Có 2 hình thức cài đặt re-captcha, sử dụng iFrame và khởi tạo bằng hàm javascript. Để tùy biến nâng cao giao diện không muốn sử dụng mặc định thì bạn chọn cách tích hợp bằng iFrame. Mình có trình bầy cả 2 cách dưới đây.

Sử dụng iFrame

Chèn đoạn mã này trong form tại vị trí nơi muốn captcha sẽ hiển thị nhé.

 
…….. ……

 

Chú ý thay giá trị publickey của bạn vào tham số k ở 2 nơi. Hai giá trị challenge và response ở 2 trường sẽ tự động điền giá trị sau khi ấn submit form. Điều này chỉ sẩy ra khi dùng iframe thôi nhé. Bạn hãy xem cách thứ 2 ở dưới, chúng ta phải lấy các tham số này bằng cách thủ công.

Hàm Recaptcha.focus_response_field() giống hàm focus() trong javascript. Đoạn code trên có tác dụng hiển thị captcha, còn phần xác nhận giá trị captcha bạn xem tiếp ở phần dưới nhé.

Sử dụng javascript

Thêm thư viện re-captcha vào trong thẻ head.

<script type="text/javascript" src="http://www.google.com/recaptcha/api/js/recaptcha_ajax.js"></script>

Tạo re-captcha hỗ trợ JS và trình duyệt không hỗ trợ javascript cũng sử dụng được tính năng captcha này thông qua iframe. Tuy nhiên đa phần là chúng ta tích hợp re-captch với javascript vì nó có nhiều lợi ích và cũng dùng được API nhiều hơn. Để chứng cách dùng mình có chuẩn bị form đơn giản như sau:

 

 

Tạo thêm thẻ div có tên ID, thẻ này sẽ chứa đối tượng Captcha. Để hiển thị captcha vào trong thẻ div này chúng ta có đoạn mã:

function showCaptcha(){
Recaptcha.create("your-public-key",
    "captcha",
    {
      theme: "clean",
      callback: Recaptcha.focus_response_field
    }
  );
}

Gọi hàm này ở thời điểm hiển thị captcha, bạn có thể cho hiện thị ngay ban đầu khi nạp trang với sự kiện $(document).ready. Khởi tạo với hàm Recaptcha.create, truyền publicKey và ID của thẻ div sẽ xuất hiện hình captcha. Các tham số cấu hình thêm như giao diện của captcha và thông tin khác bạn khai báo ở đối tượng json.

Mặc định, captcha làm việc cả trên localhost (127.0.0.1), nên trước khi up lên host thì cứ test trên localhost thoải mái.

Có 4 giao diện cố định ‘red’, ‘white’,’blackglass’ và ‘clean’.
re-captcha theme.
Ví dụ đổi sang giao diện ‘red’.

Recaptcha.create("your-public-key",
    "captcha",
    {
      theme: "red",
      callback: Recaptcha.focus_response_field
    }
  );

Ngoài ra nếu thích tạo giao diện riêng cho website thì học cách tùy biến giao diện re-catcha ở đây.

Chúng ta cần thêm 2 hidden fields chứa thông tin “challenge” và “mã số captcha” trên đối tượng re-captcha. Thông số này cần xác định trước khi form được sử lý và tham số này sẽ lấy bởi api Recaptcha.get_challenge() và Recaptcha.get_response(). Cách tốt nhất cho giá trị trả về của get_challenge() là đưa vào thành phần hidden của form và cả response như sau:

<textarea class="hidden" cols="40" name="recaptcha_challenge_field" rows="3"></textarea> <input name="recaptcha_response_field" type="text" />

Sử dụng sự kiện form “onsubmit” , chúng ta sẽ lấy 2 giá trị này trên re-captcha và đưa vào hidden field. Sửa lại form trên:

…

Một số các api của đối tượng global Recaptcha, bạn tự tìm hiểu thêm sau. Như vậy khi nhấn submit các giá trị quan trọng giúp người dùng có vượt qua captcha hay không cần phải đưa chính xác vào fields. Và trước khi sử lý form chúng ta sẽ có một đoạn mã verify captcha, bằng cách lấy thông tin từ form fields vào API http://www.google.com/recaptcha/api/verify.

Ví dụ sau sử dụng CURL với PHP.

if(isset($_POST['submit1'])){
	$challenge=$_POST['recaptcha_challenge_field'];
	$response=$_POST['recaptcha_response_field'];
 
	$ch=curl_init('http://www.google.com/recaptcha/api/verify');
	curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
	curl_setopt($ch,CURLOPT_POST,1);
	curl_setopt($ch,CURLOPT_POSTFIELDS,array(
		'privatekey'=&gt;'&lt; your-private-key &gt;',
		'challenge'=&gt;$challenge,
		'response'=&gt;$response,
		'remoteip'=&gt;$_SERVER['REMOTE_ADDR']
	));
	$captcha_result=curl_exec($ch);
}

Nếu thành công $captcha_result trả về chuỗi “true success”, còn nếu gõ sai thì trả về:

false
incorrect-captcha-sol

Tải demo.

Tạo re-captcha với PHP

Google re-captcha cung cấp thư viện php cho bạn tạo re-captcha. Các bạn có thể tải ở đây: http://code.google.com/p/recaptcha/downloads/list?q=label:phplib-Latest
Thư viện chỉ một file duy nhất require_once('recaptchalib.php');

Chèn đoạn sau vào vị trí trong form muốn hiển thị captcha.

require_once('recaptchalib.php');
  $publickey = "your_public_key"; // you got this from the signup page
  echo recaptcha_get_html($publickey);

Nhớ thay your_public_key bằng publickey của bạn.

Phần sử lý form, chúng ta sử dụng hàm recaptcha_check_answer, xác nhận tính xác thực của captcha.

 <!--?php require_once('recaptchalib.php'); $privatekey = "your_private_key"; $resp = recaptcha_check_answer ($privatekey, $_SERVER["REMOTE_ADDR"], $_POST["recaptcha_challenge_field"], $_POST["recaptcha_response_field"]); if (!$resp-&gt;is_valid) {
    // What happens when the CAPTCHA was entered incorrectly
    die ("The reCAPTCHA wasn't entered correctly. Go back and try it again." .
         "(reCAPTCHA said: " . $resp-&gt;error . ")");
  } else {
    // Your code here to handle a successful verification
  }
  ?-->

Nếu $resp->is_valid trả về true thì mã captcha điền đúng. Trường hợp điền sai sẽ có giá trị false và $resp->error đưa ra mã lỗi.

invalid-site-private-key Lỗi private key. Nếu chưa biết thông số này thì vào đây và chọn vào domain bạn đang sử dụng captcha đó. Đảm bảo copy toàn bộ không chứa dấu cách và chỉ gồm 40 ký tự.
invalid-request-cookie Tham số challenge có giá trị sai. Xem lại bước lấy challenge hãy chắc chắn lấy giá trị chính xác từ hàm Recaptcha.get_challenge(), bạn cũng kiểm tra lại publickey xem có chính xác không?
incorrect-captcha-sol Do user điền sai mã captcha trên hình.
captcha-timeout CAPTCHA hết hạn do đợi quá lâu mà không submit form.
recaptcha-not-reachable Nếu có gặp lỗi này thì server google captcha đang có vấn đề 😀

Để nhận được bài viết mới vui lòng đăng ký kênh kiến thức WordPress từ A-Z ở Form bên dưới. Bạn cũng có thể nhận được sự trợ giúp trên Twitter và Facebook

  • shares
  • Facebook
  • Facebook Messenger
  • Gmail
  • Viber
  • Skype

Chuyên mục: PHP Tìm kiếm: captcha, chống spam

Tôi giúp gì cho bạn?

HOÀNG WEB

Địa chỉ: Tây Sơn, Phường Quang Trung, Quận Đống Đa, Hà Nội

Hotline: 0987 342 124 – 0868 292 303 (8h:00 – 21h:00)

Email: [email protected]

Website: www.hoangweb.com

KẾT NỐI VỚI TÔI

  • Facebook
  • GitHub
  • YouTube

SẢN PHẨM

  • Plugin Thanh Toán Quét Mã QR Code Tự Động
  • WP2Speed – Tối ưu Google Speed
  • 23WebHost – Hosting Miễn Phí 100GB

LIÊN KẾT

  • Có nên thuê thiết kế website giá rẻ?
  • Hướng dẫn thanh toán
  • Chính sách hoàn tiền
  • Trung tâm hỗ trợ

Copyright © 2023 | All rights reserved | HOANG WEB
Mọi hình thức sao chép nội dung trên website này mà chưa được sự đồng ý đều là trái phép.