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

· 2026-02-19 (목) 20:29:44 · 5559 · 6

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

/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) 26회 2026-02-19 20:29
5명이 반응했습니다
|

댓글 6개

좋은 기능 감사합니다

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

헤드값에 넣고 싶습니다

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

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

 

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

 

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

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

감사 합니다.
2026-02-22 (일) 09:37:45
감사합니다 ^^
정말 감사합니다.~
감사합니다.
댓글을 작성하시려면 로그인이 필요합니다.

그누보드5 팁자료실

2,788건
+
제목 글쓴이 날짜 조회
03-07 조회 5,124
03-06 조회 4,419
03-06 조회 4,489
03-05 조회 4,731
03-02 조회 4,404
02-19 조회 5,560
02-19 조회 6,068
02-18 조회 3,560
02-06 조회 5,889
02-02 조회 5,028
01-31 조회 3,784
01-25 조회 3,861
01-22 조회 3,919
01-19 조회 3,665
01-18 조회 3,762
01-17 조회 3,688
01-15 조회 4,280
01-14 조회 4,324
01-08 조회 3,738
01-07 조회 3,701
01-02 조회 3,947
25-12-31 조회 5,118
25-12-30 조회 3,559
25-12-29 조회 3,927
25-12-20 조회 3,879
25-12-17 조회 3,560
25-12-10 조회 3,622
25-12-10 조회 3,742
25-12-07 조회 3,607
25-12-07 조회 5,259