일반 폼메일에 그누보드캡챠 도임하기

안녕하세요,

그누보드 5.x 를 사용하고 잇습니다. 그리고 일반 웹페이지에서 일반적인 폼메일을 작성햇습니다.
그리고 이 폼메일에 글쓰기에서 문자로 검증하는 그누보드캡챠를 도입하려면 어떻게 해야 할까요?
구글캡챠 도입방법은 어떻게 될까요?

댓글 주시는 분께 미리 감사올립니다~^^
|

답변 5개 / 댓글 3개

앞 답변의 넣는 방법이 맞습니다. 직접 만든 폼메일에서 빠뜨리기 쉬운 부분 두 가지만 보탭니다.

1. 한 번 맞힌 캡챠로 여러 번 보낼 수 있습니다

기본 캡챠(plugin/kcaptcha/kcaptcha.lib.php)의 chk_captcha()는 입력값이 세션의 정답과 같은지만 봅니다.
맞혔을 때 정답을 지우지 않습니다. 새 캡챠 이미지를 받기 전까지는 같은 값으로 다시 보내도 통과합니다.
그래서 스팸 프로그램이 한 번만 맞히면, 같은 세션으로 POST를 반복해서 메일을 여러 통 보낼 수 있습니다.

그누보드 공식 폼메일(bbs/formmail_send.php)은 이 때문에 세션별 발송 횟수를 따로 세고, 3회를 넘으면 막습니다. 소스 주석에도 "직접 POST 우회 방지"라고 적혀 있습니다.
직접 만드신 발송 파일에도 같은 장치를 넣어 두시길 권합니다. 메일을 보낸 직후 캡챠 정답을 비워 두면, 다음 발송 때는 새 캡챠를 다시 풀어야 합니다.

Copy
<?php
include_once('./_common.php');
include_once(G5_CAPTCHA_PATH.'/captcha.lib.php');
include_once(G5_LIB_PATH.'/mailer.lib.php');

// 세션별 발송 횟수 제한 (공식 formmail_send.php 와 같은 방식)
$send_count = (int)get_session('ss_myform_count') + 1;
set_session('ss_myform_count', $send_count);
if ($send_count > 3) alert('발송 횟수를 초과했습니다.');

if (!chk_captcha()) alert('자동등록방지 숫자가 틀렸습니다.');

// 여기서 mailer() 로 발송합니다.

// 발송 후 정답을 비워 같은 값으로 다시 보내지 못하게 합니다.
set_session('ss_captcha_key', '');

마지막 줄은 기본 캡챠(kcaptcha)를 쓸 때만 해당합니다. ss_myform_count 는 예시 이름이니 사이트에 맞게 바꾸셔도 됩니다.

2. 공식 문서도 기본 캡챠 대신 다른 캡챠를 권합니다

5.6.42 배포 안내의 "검증과 한계" 항목에 기본 Kcaptcha의 음성 파일 방식 때문에 자동 판독 문제가 있다고 적혀 있습니다. 같은 자리에서 기본환경설정이 지원하는 다른 캡챠를 쓰라고 권합니다.
스팸이 많은 폼이라면 처음부터 기본환경설정에서 reCAPTCHA로 바꿔 두시는 편이 낫습니다. 앞 답변 말씀대로 코드는 그대로 두고 설정만 바꾸면 됩니다.

근거 (그누보드5 공식 저장소 v5.6.43)
https://github.com/gnuboard/gnuboard5/blob/v5.6.43/plugin/kcaptcha/kcaptcha.lib.php#L272-L292
https://github.com/gnuboard/gnuboard5/blob/v5.6.43/bbs/formmail_send.php#L12-L24
https://github.com/gnuboard/gnuboard5/blob/v5.6.43/docs/release-5.6.42.md (검증과 한계)

2026-10-21 (수) 23:36:10

직접 만드신 페이지에서도 그누보드의 common.php를 include 하고 있다면 캡챠 함수 세 개만 쓰시면 됩니다.

<?php
include_once('./_common.php');
include_once(G5_CAPTCHA_PATH.'/captcha.lib.php');
?>
<form onsubmit="return fmail_submit(this);" method="post" action="send.php">
    ...
    <?php echo captcha_html(); ?>
</form>
<script>
function fmail_submit(f) {
    <?php echo chk_captcha_js(); ?>
    return true;
}
</script>

받는 쪽(send.php)에서는 메일을 보내기 전에 아래처럼 서버 검증을 꼭 넣어 주세요. 이 부분이 없으면 자바스크립트를 우회해 스팸이 들어옵니다.

include_once(G5_CAPTCHA_PATH.'/captcha.lib.php');
if (!chk_captcha()) alert('자동등록방지 숫자가 틀렸습니다.');

구글 캡챠는 코드를 바꾸실 필요가 없습니다. 관리자 > 환경설정 > 기본환경설정에서 캡챠를 reCAPTCHA로 바꾸고 사이트 키·비밀 키를 넣으면, G5_CAPTCHA_PATH가 해당 플러그인 폴더를 가리키게 되어 위 코드가 그대로 동작합니다.

기존 답변에 적용 위치 두 곳을 보완합니다. 그누보드5 공식 소스를 AI로 확인한 내용이며, 작성하신 폼메일에서 직접 테스트한 결과는 아닙니다.

첫째, chk_captcha_js() 출력은 독립된 script 최상위에 넣지 말고 폼의 onsubmit에서 호출하는 함수 안에 넣어야 합니다. 기본 kcaptcha의 반환문이 if (!chk_captcha()) return false; 이기 때문입니다. 공식 skin/member/basic/formmail.skin.php도 fformmail_submit(f) 함수 내부에서 출력합니다. 기존 전송 함수가 있다면 그 함수의 메일 전송/Ajax 요청보다 앞에 넣고, 실패 시 전송을 중단하세요.

둘째, 화면 표시와 자바스크립트 검사만으로 끝내면 안 됩니다. 실제 메일 발송을 처리하는 PHP에서도 _common.php와 G5_CAPTCHA_PATH.'/captcha.lib.php'를 로드한 뒤, mailer()를 호출하기 전에 아래처럼 서버 검사를 해야 합니다.

Copy
if (!chk_captcha()) {
    alert('자동등록방지 문자가 올바르지 않습니다.');
}
// 이 검사를 통과한 다음 기존 발송 처리

공식 bbs/formmail_send.php가 이 순서입니다. 폼의 captcha_key 입력이 실제 POST에 포함되어야 하고, 캡차 화면과 발송 PHP가 같은 그누보드 세션을 사용하는 환경이어야 합니다. 별도 도메인·독립 서버의 폼이라면 위 include만 붙여서는 동작하지 않을 수 있습니다.

수신 주소는 서버에서 정한 주소나 허용 목록으로 제한하세요. 캡차를 추가해도 임의의 외부 수신자로 발송되는 구조가 안전해지는 것은 아닙니다. 설치된 캡차 플러그인이 기본 kcaptcha와 다르다면 해당 플러그인의 동작도 확인해야 합니다.

근거: 기본 폼의 onsubmit 검사 위치 / 메일 발송 전 PHP 검사 / 기본 캡차 함수 구현

답변에 대한 댓글 1개

소중한 가르침을 주셔서 너무 감사올립니다~ 제게는 정말로 많이 도움되었습니다~^^

그누보드 기본 캡차는 별도의 외부 키 발급 없이 그누보드 내부 함수만 호출해서 사용합니다.

호출 : captcha_html()

검증 : chk_captcha()

구글 캡차는 보안성과 클릭 한 번으로 인증되어 좋지만 구글 콘솔에서 도메인 별 키 발급과 서버측 cURL/file_get_contents 검증 코드가 추가로 필요하고 단계별로 정리하면 아래와 같습니다.
1. 구글 캡차를 도입하려면 먼저 Google reCAPTCHA Admin 사이트에서 사이트를 등록
2. 키(Site Key)와 비밀 키(Secret Key)를 발급
3. 체크박스 형태인 reCAPTCHA v2 "로봇이 아닙니다"형식으로 사용

답변에 대한 댓글 1개

소중한 가르침을 주셔서 너무 감사올립니다~ 제가 초보이다 보니 질문드리게 되었습니다~ 가르쳐주신대로 잘 실천하겠습니다~^^
기본 글쓰기 폼에서 캡차가 어떤식으로 적용이 되어있는지 분석부터 하세요 선생님. 폼메일 작성페이지에서 도 그대로 적용해주시면됩니다.
예를들어서
폼메일 작성 페이지에 다음과 같이 상단에 라이브러리 함수 추가
<?php
include_once('./_common.php');
include_once(G5_CAPTCHA_PATH.'/captcha.lib.php');

$captcha_html = captcha_html();
$captcha_js = chk_captcha_js();
?>
다음 폼안에 캡챠 호출
<div class="write_div">
    <?php echo $captcha_html; ?>
</div>
그리고 하단에 스크립트 검증
<script>
<?php echo $captcha_js; ?>
</script>

답변에 대한 댓글 1개

소중한 가르침을 주셔서 너무 감사올립니다~ 가르쳐주신대로 꼭 실천하고 문제해결하겠습니다~^^

답변을 작성하려면 로그인이 필요합니다.