위버

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

회원글쓰기 게시판에 계속 스팸글이 올라와서 테스트가 가능할때 한번 만들어봤습니다. 마우스움직임이 직선(기계적일 경우 스팸), 선형(사람) 으로 구분해서 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개

감사합니다. ^^

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

감사합니다

댓글을 작성하시려면 로그인이 필요합니다.
+
제목 글쓴이 날짜 조회
25-06-25 조회 4,307
25-06-24 조회 4,223
25-06-24 조회 4,348
25-06-22 조회 4,454
25-06-21 조회 5,323
25-06-17 조회 4,181
25-06-17 조회 4,065
25-06-11 조회 4,673
25-06-02 조회 4,296
25-05-28 조회 4,197
25-05-25 조회 4,121
25-05-17 조회 4,199
25-05-17 조회 4,496
25-05-15 조회 4,125
25-05-15 조회 4,496
25-05-14 조회 3,941
25-05-13 조회 4,019
25-05-06 조회 4,296
25-05-06 조회 4,298
25-05-05 조회 4,070
25-05-02 조회 4,580
25-04-27 조회 4,091
25-04-25 조회 3,918
25-04-24 조회 3,950
25-04-23 조회 4,138
25-04-22 조회 4,119
25-04-20 조회 4,263
25-04-19 조회 4,539
25-04-13 조회 4,333
25-04-12 조회 4,109