การเรียก reCaptcha มาใช้ แบบไม่ผ่าน XML Form

แชร์ ความรู้ในการ พัฒนา Joomla Component Extension Module Plugin

Moderator: mindphp, ผู้ดูแลกระดาน

ภาพประจำตัวสมาชิก
tsukasaz
PHP VIP Members
PHP VIP Members
โพสต์: 22100
ลงทะเบียนเมื่อ: 18/04/2012 9:39 am

การเรียก reCaptcha มาใช้ แบบไม่ผ่าน XML Form

โพสต์ที่ยังไม่ได้อ่าน โดย tsukasaz »

การสร้างฟอร์มบันทึกข้อมูลบนเว็บไซต์ที่เปิดให้ผู้ใช้งานทั่วไปสามารถใส่ข้อมูลเข้ามาในระบบได้ นอกจากผู้พัฒนาต้องระบุเงื่อนไขในการกรอกช่องต่างๆ ให้ถูกต้องแล้ว จำเป็นต้องมีการป้องกันการโจมตีจากผู้ไม่หวังดีด้วย ไม่ว่าจะเป็นการโจมตีแบบ CSRF หรือ โจมตีแบบ SPAM ซึ่งปกติแล้วในระบบ Joomla จะมีการป้องกันการโจมตี CSRF ทุกฟอร์มอยู่แล้ว แต่สำหรับการโจมตีแบบ SPAM จำเป็นต้องมีการตั้งค่าเปิดใช้งานตัว reCaptcha ก่อน ซึ่งปกติถ้าจะสร้างฟอร์มใน Joomla ที่มี reCaptcha ด้วย ก็แค่เพิ่มฟิล์ดใน XML Form กำหนด Type เป็น Captcha ก็จะสามารถใช้งานได้

สำหรับกระทู้นี้จะแนะนำการเรียกใช้ reCaptcha สำหรับใช้ในกรณีที่ในฟอร์มนั้นไม่ได้เรียกจาก XML Form

ตัวอย่างโค้ด

โค้ด: เลือกทั้งหมด

<?php
// กำหนด class ที่เราจะเรียกใช้งาน ที่จำเป็นจะมี 2 ตัวนี้
use Joomla\CMS\Factory;
use Joomla\CMS\Captcha\Captcha;

// ดึงค่าจาก Global Configuration ของ Joomla ว่าใช้ reCaptcha ตัวไหนอยู่
$plugin = Factory::getConfig()->get('captcha');

// ถ้ามีการกำหนด reCaptcha ใน Global Configuration ให้ทำงานใน if
if ($plugin)
{
	// เรียก class Captcha มาใช้
	$captcha = new Captcha($plugin, array ());
	// ใช้ method ชื่อ display สำหรับแสดงผล สามารถกำหนด ชื่อ และ ไอดี ได้ ในตัวอย่างจะใช้ my_captcha
	echo $captcha->display('my_captcha', 'my_captcha');
}
ตัวอย่างการแสดงผล
Joomla Developing Knowledge-1.png
Joomla Developing Knowledge-1.png (47.46 KiB) Viewed 1035 times

จากนั้น หลังจากที่ผู้ใช้งานกด Submit ข้อมูลเข้ามาในระบบ จะต้องมีการเช็คข้อมูลของตัว reCaptcha ด้วย

โค้ด: เลือกทั้งหมด

<?php
// กำหนด class ที่เราจะเรียกใช้งาน ที่จำเป็นจะมี 2 ตัวนี้
use Joomla\CMS\Factory;
use Joomla\CMS\Captcha\Captcha;

// เรียกใช้ object ของ Application อันนี้จะใช้แสดงข้อความแจ้ง กับ ย้ายหน้าเว็บ
$app = Factory::getApplication();
// ดึงค่าจาก Global Configuration ของ Joomla ว่าใช้ reCaptcha ตัวไหนอยู่
$plugin = Factory::getConfig()->get('captcha');
// ถ้ามีการกำหนด reCaptcha ใน Global Configuration ให้ทำงานใน if
if ($plugin)
{
	// เรียกไฟล์ภาษาของตัว captcha มาใช้ กรณีมี error หรือ ข้อความแจ้งเตือน
	$language = Factory::getLanguage();
	$language->load('plg_captcha_' . $plugin, JPATH_ROOT . '/administrator');

	// เรียก class Captcha มาใช้
	$captcha = new Captcha($plugin, array ());

	// เช็คค่าของ reCaptcha ที่ส่งมาจากฟอร์ม 
	if (!$captcha->checkAnswer(null))
	{
		// กรณีค่าของ reCaptcha ไม่ถูกต้อง ให้ส่งข้อความแจ้ง และ ย้ายหน้ากลับไปหน้าฟอร์ม
		$error = $captcha->getError();
		$app->enqueueMessage($error, 'warning');
		$app->redirect(JRoute::_('index.php?option=com_mycomponent&view=myview'));
	}
}
สำหรับการเรียกใช้ reCaptcha แบบไม่ผ่าน XML Form จะมีโค้ดและขั้นตอนเท่านี้ โดยแบ่งเป็นโค้ดส่วนที่ใช้สำหรับแสดงผล reCaptcha ภายในฟอร์ม ซึ่งถ้าทำตามแล้วไม่มี reCaptcha ขึ้นมาแสดง ให้ลองเช็คการตั้งค่าใน Plugin ของ reCaptcha รวมถึงการตั้งค่าใน Global Configuration ให้ถูกต้องก่อน เมื่อผู้ใช้กดบันทึกก็จะเป็นหน้าที่ของโค้ดส่วนที่สอง ซึ่งจะตรวจสอบค่า reCaptcha ที่ส่งมาจากฟอร์ม จะเห็นได้ว่าใช้โค้ดไม่เยอะเลย สำหรับผู้ที่สนใจสามารถนำโค้ดนี้ไปศึกษาและประยุกต์ใช้กับงานของตัวเองได้ เพื่อให้ฟอร์มบันทึกข้อมูลมีความปลอดภัยมากขึ้น
The last bug isn't fixed until the last user is dead. (Sidney Markowitz, 1995)
  • Similar Topics
    ตอบกลับ
    แสดง
    โพสต์ล่าสุด

ผู้ใช้งานขณะนี้

สมาชิกกำลังดูบอร์ดนี้: ไม่มีสมาชิกใหม่ และบุคลทั่วไป 44