심플한 스팸 방지코드 입니다

접수페이지등에 무차별적으로 들어오는 스팸때문에 적용한 방법입니다.

/extend/ 폴더에 spamguard.extend.php 와 같은 이름으로 삽입하시고

인덱스나 필수 방문 페이지에 토큰 생성 함수 넣으시고

접수 페이지등 입력 페이지에서 검증 함수만 호출 하시면 됩니다.

 

필수경로를 통해 접근 했는지와 리퍼러 페이지가 현재 도메인인지를 체크 합니다.

토큰 유지 시간이나 시크릿 키 변경해서 사용하시면 됩니다.

도움이 될지는 모르겠지만 일단은 이렇게 하니 무차별 스팸은 어느정도 막히더라구요. ^^


<?php
/**
 * 사용법:
 *   토큰생성 :  spam_guard_set_token()           — 메인/서브페이지 등에서 호출
 *   검증 :      spam_guard_validate()                — 반환값으로 직접 분기 처리
 *   검증+차단:  spam_guard_block_if_invalid()   — 실패 시 alert & 중단
 */

if (!defined('_GNUBOARD_')) exit;

// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
//  설정
// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
define('SPAM_GUARD_SECRET', 'sftp-secret-key-supert-this');
define('SPAM_GUARD_COOKIE', '_vt');
define('SPAM_GUARD_EXPIRE', 3600); // 1시간


function _spam_guard_make_token($date_str)
{
    $ip = isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : '';
    return md5($ip . SPAM_GUARD_SECRET . $date_str);
}

function _spam_guard_get_allowed_host()
{
    if (defined('G5_URL') && G5_URL) {
        $parsed = parse_url(G5_URL);
        return isset($parsed['host']) ? $parsed['host'] : '';
    }
    return isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : '';
}

function spam_guard_set_token()
{
    $token = _spam_guard_make_token(date('Y-m-d'));
    setcookie(SPAM_GUARD_COOKIE, $token, time() + SPAM_GUARD_EXPIRE, '/');
}

function spam_guard_validate()
{
    if (!isset($_COOKIE[SPAM_GUARD_COOKIE]) || $_COOKIE[SPAM_GUARD_COOKIE] === '') {
        return '잘못된 접근입니다.';
    }

    $cookie_val         = $_COOKIE[SPAM_GUARD_COOKIE];
    $expected_today     = _spam_guard_make_token(date('Y-m-d'));
    $expected_yesterday = _spam_guard_make_token(date('Y-m-d', strtotime('-1 day')));

    if ($cookie_val !== $expected_today && $cookie_val !== $expected_yesterday) {
        return '인증 정보가 유효하지 않습니다.';
    }

    $referer = isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '';
    if ($referer === '') {
        return '잘못된 경로로 접근하셨습니다.';
    }

    $allowed  = _spam_guard_get_allowed_host();
    $parsed   = parse_url($referer);
    $ref_host = isset($parsed['host']) ? $parsed['host'] : '';

    $allowed  = preg_replace('/^www\./', '', strtolower($allowed));
    $ref_host = preg_replace('/^www\./', '', strtolower($ref_host));

    if ($ref_host !== $allowed) {
        return '허용되지 않은 경로입니다.';
    }

    return '';
}

function spam_guard_block_if_invalid()
{
    $error = spam_guard_validate();
    if ($error !== '') {
        alert($error);
    }
}

첨부파일

spamguard.extend.php (2.6 KB) 3회 2026-02-19 20:29
2명이 반응했습니다
|

댓글 3개

좋은 기능 감사합니다

토큰생성 함수를 어떻게 넣어야 하나요

헤드값에 넣고 싶습니다

/index.php 또는 DB접수 전 안내 페이지 같은 필수로 거쳐가야 하는 곳에 토큰생성 함수를 넣어주시면 됩니다.

include_once("_common.php"); 라인 바로 밑에요.

 

spam_guard_set_token(); /* 토큰 생성 함수 호출 */

 

DB접수 페이지에서 호출하는 헤더에 넣으시면

토큰생성과 검증이 동시에 이루어져 의미가 없어지니 별도 파일에서 토큰생성 함수를 호출해주시면 됩니당~

감사 합니다.
댓글을 작성하시려면 로그인이 필요합니다.

그누보드5 팁자료실

+
제목 글쓴이 날짜 조회
3년 전 조회 4,886
어제 조회 59
2일 전 조회 59
3일 전 조회 64
2주 전 조회 342
2주 전 조회 298
3주 전 조회 294
3주 전 조회 358
1개월 전 조회 402
1개월 전 조회 457
1개월 전 조회 446
1개월 전 조회 427
1개월 전 조회 630
1개월 전 조회 501
1개월 전 조회 513
1개월 전 조회 481
1개월 전 조회 613
1개월 전 조회 588
1개월 전 조회 470
1개월 전 조회 690
2개월 전 조회 659
2개월 전 조회 594
2개월 전 조회 601
2개월 전 조회 690
2개월 전 조회 572
2개월 전 조회 580
2개월 전 조회 746
2개월 전 조회 577
2개월 전 조회 776
2개월 전 조회 658
2개월 전 조회 750