게시판글쓰기, 회원가입 스팸방지 정보
게시판글쓰기, 회원가입 스팸방지본문
회원글쓰기 게시판에 계속 스팸글이 올라와서 테스트가 가능할때 한번 만들어봤습니다. 마우스움직임이 직선(기계적일 경우 스팸), 선형(사람) 으로 구분해서 hidden input에 값을 넣고 서버에서 다시 체크합니다. 하루 몇천개씩 들어오던 스팸글이 3개 정도 올라왔네요.
/extend/wv_spam.extend.php
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('스팸으로 의심되어 등록이 불가합니다.');
}
}
/bbs/wv_spam_check.php
<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>
추천
9
9
댓글 3개

감사합니다. ^^

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

감사합니다