회원글쓰기 게시판에 계속 스팸글이 올라와서 테스트가 가능할때 한번 만들어봤습니다. 마우스움직임이 직선(기계적일 경우 스팸), 선형(사람) 으로 구분해서 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개
게시글 목록
| 번호 | 제목 |
|---|---|
| 23966 | |
| 23963 | |
| 23953 | |
| 23949 | |
| 23938 | |
| 23935 | |
| 23933 | |
| 23928 | |
| 23919 | |
| 23918 | |
| 23917 | |
| 23910 | |
| 23902 | |
| 23901 | |
| 23897 | |
| 23894 | |
| 23893 | |
| 23891 | |
| 23885 | |
| 23872 | |
| 23870 | |
| 23862 | |
| 23859 | |
| 23853 | |
| 23845 | |
| 23838 | |
| 23827 | |
| 23819 | |
| 23805 | |
| 23801 |
댓글 작성
댓글을 작성하시려면 로그인이 필요합니다.
로그인하기