불쾌한 스팸 중지
간단한 PHP 보안 문자 생성 방법에 대한 튜토리얼에 오신 것을 환영합니다. 화난 트롤 화염 키보드 전사들에 의해 지속적으로 스팸이 발생하는 웹 사이트가 있습니까?
보안 및 예방 조치를 취할 시간 – 보안 문자는 작업을 훌륭하게 수행하며 이 가이드는 간단한 작업을 만드는 방법을 안내합니다. 타사 프레임 워크를 사용하지 않습니다. 알아 보려면 계속 읽으십시오!
ⓘ이 자습서 마지막 부분에 모든 소스 코드가 포함 된 zip 파일이 포함되어 있으므로 모든 것을 복사하여 붙여 넣을 필요가 없습니다.
소스 코드 다운로드
먼저 약속 한대로 소스 코드에 대한 다운로드 링크가 있습니다.
소스 코드 다운로드
소스 코드를 다운로드하려면 여기를 클릭하십시오. MIT 라이센스에 따라 릴리스되었으므로 그 위에 빌드하거나 자신의 프로젝트에서 자유롭게 사용하십시오.
빠른 시작
요구 사항
라이브러리 및 사용 예제를 시작하기 전에 서버에서 GD 확장이 활성화되어 있는지 확인하십시오. 그렇지 않은 경우 이 스크립트는 보안 문자 이미지를 올바르게 그릴 수 없습니다.
GD 확장이 활성화되어야 합니다
phpinfo();
웹 서버에서 GD 확장 기능이 활성화되어 있는지 확인하려면 phpinfo() 함수를 사용하여 간단한 스크립트를 만들어 빠른 확인 만하면 됩니다. – 웹 브라우저에서 이 스크립트에 액세스하십시오.
"GD Support"를 검색하면 활성화해야 합니다. 그렇지 않다면, php.ini 파일을 편집하고; extension = gd2를 검색하십시오. 대부분의 경우 확장을 사용하려면 앞에 세미콜론만 제거하면 됩니다.
extension=gd2
보안 문자 라이브러리
이제 기본 요구 사항이 없어 졌으므로 이 전체 프로젝트를 추진할 Captcha 라이브러리를 자세히 살펴 보겠습니다.
PHP 스크립트
/* [THE CAPTCHA CLASS] */ class Captcha { function prime ($length=8) { // prime() : step 1, generates a random string and put into session // PARAM $length : number of characters for the captcha string $char = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; $max = strlen($char) - 1; $random = ""; for ($i=0; $i<=$length; $i++) { $random .= substr($char, rand(0, $max), 1); } $_SESSION['captcha'] = $random; return true; } function draw ($width=300, $height=100, $fontsize=24, $font="C:\Windows\Fonts\arial.ttf") { // draw() : step 2, generates the captcha image // PARAM $width, $height : width and height of the captcha // $font : ! CHANGE THIS TO YOUR OWN ! // CREATE BLANK IMAGE $captcha = imagecreatetruecolor($width, $height); if (isset($_SESSION['captcha'])) { // FUNKY BACKGROUND IMAGE $background = "captcha-back.jpg"; list($bx, $by) = getimagesize($background); if ($bx-$width<0) { $bx = 0; } else { $bx = rand(0, $bx-$width); } if ($by-$height<0) { $by = 0; } else { $by = rand(0, $by-$height); } $background = imagecreatefromjpeg($background); imagecopy($captcha, $background, 0, 0, $bx, $by, $width, $height); // THE TEXT SIZE $text_size = imagettfbbox($fontsize, 0, $font, $_SESSION['captcha']); $text_width = max([$text_size[2], $text_size[4]]) - min([$text_size[0], $text_size[6]]); $text_height = max([$text_size[5], $text_size[7]]) - min([$text_size[1], $text_size[3]]); // CENTERING THE TEXT BLOCK $centerX = CEIL(($width - $text_width) / 2); $centerX = $centerX<0 ? 0 : $centerX; $centerX = CEIL(($height - $text_height) / 2); $centerY = $centerX<0 ? 0 : $centerX; // RANDOM OFFSET POSITION OF THE TEXT + COLOR if (rand(0,1)) { $centerX -= rand(0,55); } else { $centerX += rand(0,55); } $colornow = imagecolorallocate($captcha, rand(120,255), rand(120,255), rand(120,255)); // Random bright color imagettftext($captcha, $fontsize, rand(-10,10), $centerX, $centerY, $colornow, $font, $_SESSION['captcha']); } else { imagefilledrectangle($captcha, 0, 0, $width, $height, imagecolorallocate($captcha, 255, 255, 255)); } // OUTPUT header('Content-type: image/png'); imagejpeg($captcha); imagedestroy($captcha); } function verify ($input) { // verify() : step 3, verifies the captcha // PARAM $input : user input // CAPTCHA NOT SET! if (!isset($_SESSION['captcha'])) { return false; } // CHECK if ($input == $_SESSION['captcha']) { unset($_SESSION['captcha']); return true; } else { return false; } } } /* [INIT CAPTCHA] */ // Mute notices // You can change this if you want error_reporting(E_ALL & ~E_NOTICE); // Start session // Remove this if the session is already started in your own project session_start(); // Create library object $libCap = new Captcha();
빠른 요약
네, 하나의 스크립트만으로 모든 것을 다룰 수 있습니다. 처음에는 복잡한 코드처럼 보일 수 있지만 여기에는 3 개의 함수 만 있습니다. 각각은 프로젝트에서 코드를 구현하는 방법에 대한 단계에 해당합니다.
Function | Description |
prime() | The first step, which will create a random alphanumeric captcha string and put it into $_SESSION['captcha'] . The default is 8 characters, and if you want a longer captcha string, simply pass in a bigger $length when calling this function. |
draw() | The second step, which generates the captcha image. As usual, you can control the width, height, font to use, and the font size – Please do remember to change the font path. |
verify() | The last step, verifies the given input – Simply matches it against $_SESSION['captcha'] and returns a true/false. |
마지막으로 스크립트 하단에 세션을 시작하고 보안 문자 객체를 생성하는 추가 비트가 있습니다. 원하는 경우 이를 제거하고 자신의 프로젝트에서 수동으로 직접 수행 할 수 있습니다.
사용 예
이제 간단한 보안 문자 라이브러리를 실제로 사용하는 방법에 대한 예를 들어 보겠습니다.
1 단계) 양식 작성
// STEP 1 - PRIME THE CAPTCHA require "captcha.php"; $libCap->prime(); // DRAW YOUR HTML FORM <html> <head> <title> PHP Captcha Demo </title> <style> /* [COSMETICS, DOES NOT MATTER] */ html, body, input { font-family: arial, sans-serif; } form { max-width: 300px; padding: 20px; border-radius: 10px; margin: 0 auto; background: #f2f2f2; } label { display: block; width: 100%; } input[type=text], input[type=email] { box-sizing: border-box; width: 100%; padding: 5px; font-size: 1em; margin-bottom: 10px; } input[type=submit] { font-size: 1em; padding: 10px; background: #b73a3a; border: 0; color: #fff; } </style> <script src="3-form.js"></script> <body> <form onsubmit="return process();"> <label for="name">Name:</label> <input id="name" type="text" required/> <label for="email">Email:</label> <input id="email" type="email" required/> <!-- [CAPTCHA HERE] --> <label for="captcha">Are you human?</label> <!-- [POINT IMAGE TAG TO PHP FILE] --> <img id="captcha-img" src="2-image.php"/> <input id="captcha" type="text" required/> <input type="submit" value="Go!"/> </form> </body> </html>
이 단계에서 너무 복잡한 것은 없습니다.
2 단계) 보안 문자 이미지
// STEP 2 - DRAW CAPTCHA IMAGE require "captcha.php"; $libCap->draw();
아마도 가장 쉬운 단계 일 것입니다. PHP 파일을 만들고 보안 문자 라이브러리를 사용하여 이미지를 생성하십시오.
3 단계) 확인
자바 스크립트
function process() { // Append data var data = new FormData(); data.append("name", document.getElementById("name").value); data.append("email", document.getElementById("email").value); data.append("captcha", document.getElementById("captcha").value); // Init AJAX var xhr = new XMLHttpRequest(); xhr.open('POST', "3-verify.php", true); // When the process is complete // JSON decode the server response xhr.onload = function () { // console.log(this.response); var res = JSON.parse(this.response); if (res.status) { // ALL OK // Redirect user to thank you page or something // window.location.href = "thank-you.html"; alert("OK"); } else { // ERROR alert(res.message); // THIS WILL REFRESH THE CAPTCHA IF YOU WANT var cimg = document.getElementById("captcha-img"); cimg.src = "2-image.php?" + new Date().getTime(); document.getElementById("captcha").value = ""; } }; // Send xhr.send(data); return false; }
다음으로 양식 제출을 처리해야 합니다. 다음은 보안 문자 문제를 포함하여 모든 양식 데이터를 가져 와서 AJAX를 통해 서버에 게시하는 더미 Javascript입니다.
서버 측 스크립트
// STEP 3 - VERIFY THE CAPTCHA require "captcha.php"; $verified = $libCap->verify($_POST['captcha']); // DO YOUR PROCESSING HERE if ($verified) { // DO SOMETHING // REGISTER USER TO NEWSLETTER OR SOMETHING // RESPONSE unset ($_SESSION['captcha']); echo json_encode([ "status" => 1, "message" => "OK" ]); } // INVALID CAPTCHA else { // CREATE A NEW CAPTCHA IF YOU WANT $libCap->prime(); echo json_encode([ "status" => 0, "message" => "Invalid captcha" ]); }
마지막으로 서버 측에서 게시 된 보안 문자열을 세션의 문자열과 일치 시키는 것만으로도 충분합니다.
문제가 해결되면 평소와 같이 처리를 진행하십시오. 그렇지 않은 경우, 오류 메시지를 클라이언트 측으로 되돌리고 보안 문자를 다시 입력하도록 요청하십시오.
유용한 비트
이것으로 코드가 완성되었으며 여기에 유용한 몇 가지 추가 기능이 있습니다.
GOOGLE RECAPTCHA
시스템 리소스를 절약하고 싶습니까? 대신 Google Recaptcha를 확인하십시오 (무료).
https://code-boxx.com/php-contact-form-recaptcha/
등록된 댓글이 없습니다.