위버

게시판글쓰기, 회원가입 스팸방지

· 2025-04-27 (일) 22:32:20 · 2625 · 3

회원글쓰기 게시판에 계속 스팸글이 올라와서 테스트가 가능할때 한번 만들어봤습니다. 마우스움직임이 직선(기계적일 경우 스팸), 선형(사람) 으로 구분해서 hidden input에 값을 넣고 서버에서 다시 체크합니다. 하루 몇천개씩 들어오던 스팸글이 3개 정도 올라왔네요. 

/extend/wv_spam.extend.php

[code]

add_event('tail_sub','wv_spam_honey_spot_add');
add_event('write_update_before','wv_spam_honey_spot_check');
add_event('register_form_update_before','wv_spam_honey_spot_check');

function wv_spam_honey_spot_add(){
    global $bo_table;

    $form_id='';

    if((wv_info('dir')=='bbs' and wv_info('file')=='write' and $bo_table  )){
        $form_id='fwrite';
    }

    if((wv_info('dir')=='bbs' and (wv_info('file')=='register' or wv_info('file')=='register_form')   )){
        $form_id='fregisterform';
    }

    if(!$form_id){
        return;
    }

    include_once G5_BBS_PATH.'/wv_spam_check.php';
}

function wv_spam_honey_spot_check(){

    if(!isset($_POST['wv_h_spot']) or $_POST['wv_h_spot']!='wv'){
        alert('스팸으로 의심되어 등록이 불가합니다.');
    }

}

[/code]

 

/bbs/wv_spam_check.php

[code]

<script>
    $(document).ready(function () {

        var $form =  $("form#<?php echo $form_id?>[name='<?php echo $form_id?>']");

        let lastX = null;
        let lastY = null;
        let lastDirection = null;
        let straightCount = 0;
        let naturalCount = 0;
        let suspicious = true; // 초기값 true

        const REQUIRED_BOT_COUNT = 80;      // 완벽 직선이 몇 번 이상이면 suspicious 유지
        const REQUIRED_HUMAN_COUNT = 20;    // 자연스러운 움직임이 몇 번 이상이면 해제

        document.addEventListener('mousemove', (e) => {
            if (lastX === null || lastY === null) {
                lastX = e.clientX;
                lastY = e.clientY;
                return;
            }

            const dx = e.clientX - lastX;
            const dy = e.clientY - lastY;

            const direction = [dx, dy];

            const isPerfectLine = (
                (dy === 0 && Math.abs(dx) === 1) ||
                (dx === 0 && Math.abs(dy) === 1) ||
                (Math.abs(dx) === 1 && Math.abs(dy) === 1)
            );

            const isSameDirection = (
                lastDirection &&
                direction[0] === lastDirection[0] &&
                direction[1] === lastDirection[1]
            );

            const isSuspiciousMove = isPerfectLine && isSameDirection;

            if (isSuspiciousMove) {
                straightCount++;
                naturalCount = 0; // 자연스러운 카운터 리셋
            } else {
                naturalCount++;
                straightCount = 0; // 봇 카운터 리셋
            }

            if (!suspicious && isSuspiciousMove && straightCount >= REQUIRED_BOT_COUNT) {
                suspicious = true;
            }

            if (suspicious && naturalCount >= REQUIRED_HUMAN_COUNT) {
                suspicious = false;
            }

            lastX = e.clientX;
            lastY = e.clientY;
            lastDirection = direction;
        });

document.addEventListener('touchmove', (e) => {
    suspicious = false;

});


        $($form).on('submit',function () {
           if(!suspicious){
               $("#wv_h_spot",$form).val('wv');
           }
       })


        $form.prepend('<input type="hidden" name="wv_h_spot" id="wv_h_spot"  value="">');

    })
</script>

[/code]

|

댓글 3개

2025-04-28 (월) 09:59:43

감사합니다. ^^

테스트 할게요. 감사 합니다.

감사합니다

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

그누보드5 팁자료실

2,788건
+
제목 글쓴이 날짜 조회
25-06-24 조회 2,632
25-06-22 조회 2,850
25-06-21 조회 3,621
25-06-17 조회 2,669
25-06-17 조회 2,556
25-06-11 조회 3,163
25-06-02 조회 2,816
25-05-28 조회 2,670
25-05-25 조회 2,645
25-05-17 조회 2,688
25-05-17 조회 2,974
25-05-15 조회 2,621
25-05-15 조회 2,993
25-05-14 조회 2,485
25-05-13 조회 2,574
25-05-06 조회 2,815
25-05-06 조회 2,789
25-05-05 조회 2,587
25-05-02 조회 3,029
25-04-27 조회 2,626
25-04-25 조회 2,410
25-04-24 조회 2,458
25-04-23 조회 2,614
25-04-22 조회 2,673
25-04-20 조회 2,800
25-04-19 조회 2,963
25-04-13 조회 2,852
25-04-12 조회 2,597
25-04-10 조회 2,912
25-04-10 조회 2,769