그누보드 [G4/G5] 스팸게시물 방지를 위한 코드
페이지 정보
본문
그누보드 스팸 방지를 위한 여러가지 방법들이 존재합니다
다양한 방법에 대한 것을 실제 테스트를 통해 확인된 사항을 정리합니다
1. 글쓰기 페이지에 머문 시간을 비교해서 스팸여부 확인
sir 마르스컴퍼니 님의 팁 : https://sir.kr/g5_tip/14663
회원 로그인 후 제목과 내용을 1111 이라고만 적어도 최소 10초가 필요합니다
물론 손빠른 사람은 그보다 빠르게 타이핑이 가능할 수 도 있으나, 극히 이례적인 상황일것으므로 대조군에서 제외하고 10초라는 시간 제한을 두고 그것보다 빠르면 글 작성을 막는 대응 방법 입니다
1-1. 게시글
mobile / skin / board / basic / write.skin.php
skin / board / basic / write.skin.php
<input type="hidden" name="page" value="<?php echo $page ?>">
내용 밑에 추가
<input type="hidden" name="w_time" value="<?php echo time(); ?>">
1-2. 게시글 저장
mobile / skin / board / basic / write_update.skin.php
skin / board / basic / write_update.skin.php
<?php
if (!defined("_GNUBOARD_")) exit;
// 일정시간내에 글 작성하면 스팸글로 차단
if (!$w_time) {
$w_time = time();
}
$spam_time_check = time() - $w_time;
if ($spam_time_check < 10) {
alert('비정상적인 접근입니다.');
exit();
}
2. 메인 페이지 세션이 없는 경우 글쓰기 금지
sir 마르스컴퍼니 님의 팁 : https://sir.kr/g5_tip/16141
extend / spam_deny.php 생성하고 추가
<?php
if (!defined('_GNUBOARD_')) exit; // 개별 페이지 접근 불가
// 메인 페이지를 방문하지 않고 글작성을 시도하는 경우 차단
$spam_deny_checkurl = basename($_SERVER['SCRIPT_NAME']);
if ($spam_deny_checkurl == 'index.php') {
set_session('ss_spam_index_token', true);
}
if ($spam_deny_checkurl == 'write_update.php' || $spam_deny_checkurl == 'write_comment_update.php') {
if (!get_session('ss_spam_index_token')) {
die('허용되지 않은 접근입니다.');
}
}
3. 글 작성자의 이름일때 글쓰기 차단
sir 균이 님의 팁 : https://sir.kr/qa/468232?#answer_468235
3-1. 게시글
mobile / skin / board / basic / write_update.head.skin.php
skin / board / basic / write_update.head.skin.php
<?php
if (!defined("_GNUBOARD_")) exit;
// 작성자 이름이 영어로만 구성된 경우 스팸글로 차단
if($w == '' || $w == 'r') {
if ($member['mb_id']) {
$wr_name = addslashes(clean_xss_tags($board['bo_use_name'] ? $member['mb_name'] : $member['mb_nick']));
} else {
// 비회원의 경우 이름이 누락되는 경우가 있음
$wr_name = clean_xss_tags(trim($_POST['wr_name']));
}
if( isset($wr_name) && !preg_replace("/[a-zA-Z0-9]/",'', $wr_name) ) die;
}
3-2. 댓글
mobile / skin / board / basic / write_comment_update.head.skin.php
skin / board / basic / write_comment_update.head.skin.php
<?php
if (!defined('_GNUBOARD_')) exit; // 개별 페이지 접근 불가
// 작성자 이름이 영어로만 구성된 경우 스팸글로 차단
$w = $_POST["w"];
$wr_name = trim($_POST['wr_name']);
if($w == '' || $w == 'r') {
if ($member['mb_id']) {
$wr_name = addslashes(clean_xss_tags($board['bo_use_name'] ? $member['mb_name'] : $member['mb_nick']));
} else {
// 비회원의 경우 이름이 누락되는 경우가 있음
$wr_name = clean_xss_tags(trim($_POST['wr_name']));
}
if( isset($wr_name) && !preg_replace("/[a-zA-Z0-9]/",'', $wr_name) ) die;
}
4. 해외 아이피 글쓰기 차단
sir 이도훈 님의 팁 : https://sir.kr/qa/391725#answer_391740
데모 : https://www.happyjung.com/demo/php/x-real_ip.php
mobile / skin / board / basic / write_update.head.skin.php
skin / board / basic / write_update.head.skin.php
<?php
if (!defined("_GNUBOARD_")) exit;
// 해외아이피 글쓰기 차단
$client_ip = isset($_SERVER['HTTP_CLIENT_IP'])?$_SERVER['HTTP_CLIENT_IP']:isset($_SERVER['HTTP_X_FORWARDED_FOR'])?$_SERVER['HTTP_X_FORWARDED_FOR']:$_SERVER['REMOTE_ADDR'];
$details = json_decode(file_get_contents("https://ipinfo.io/{$client_ip}/json"));
if($details->country != "KR"){
alert("Only Korea Accept");
exit();
}
5. hook 이용 자동으로 글 쓰는 스팸 막기 ( 그누보드 5.4.3 이상에만 사용 가능 )
sir thisgun 님의 팁 : https://sir.kr/g5_plugin/10184
extend / spam.write.ban.extend.php 파일 생성후 아래 내용 저장
<?php
if (!defined('_GNUBOARD_')) exit; // 개별 페이지 접근 불가
// hook 이용 자동으로 글 쓰는 스팸 막기
if(!defined('CHECK_WRITEPAGE_SPAM_INPUT_NAME')){
// 아래 상수값 영문소문자+숫자로 되어 있는 부분을 반드시 영문소문자+숫자로 마음대로 변경해주세요.
define('CHECK_WRITEPAGE_SPAM_INPUT_NAME', 'abc123def456ghi');
}
if(!defined('CHECK_WRITEPAGE_SPAM_INPUT_VALUE')){
// 아래 상수값 한글로 되어 있는 부분을 반드시 한글로 마음대로 변경해주세요.
define('CHECK_WRITEPAGE_SPAM_INPUT_VALUE', '대한민국사랑해');
}
add_event('bbs_write', 'g5_check_spam_write_page', 1, 2);
function g5_check_spam_write_page($board, $wr_id){
add_event('tail_sub', 'g5_add_script_write_page_input');
}
function g5_add_script_write_page_input(){
?>
<script>
jQuery(function ($) {
$('<input>').attr({
type: 'hidden',
name: '<?php echo CHECK_WRITEPAGE_SPAM_INPUT_NAME; ?>',
value: '<?php echo CHECK_WRITEPAGE_SPAM_INPUT_VALUE; ?>'
}).appendTo('form[name=fwrite]');
});
</script>
<?php
}
add_event('write_update_before', 'g5_check_spam_write_update_before', 1, 2);
function g5_check_spam_write_update_before($board, $wr_id){
if( isset($_POST[CHECK_WRITEPAGE_SPAM_INPUT_NAME]) && $_POST[CHECK_WRITEPAGE_SPAM_INPUT_NAME] === CHECK_WRITEPAGE_SPAM_INPUT_VALUE ){
return;
} else {
alert("스팸 싫어요");
exit();
}
}
참고자료
https://sir.kr/g5_tip/14663
https://sir.kr/g5_tip/16141
https://sir.kr/qa/468232?#answer_468235
https://sir.kr/g5_plugin/10184
https://sir.kr/qa/391725#answer_391740
다양한 방법에 대한 것을 실제 테스트를 통해 확인된 사항을 정리합니다
1. 글쓰기 페이지에 머문 시간을 비교해서 스팸여부 확인
sir 마르스컴퍼니 님의 팁 : https://sir.kr/g5_tip/14663
회원 로그인 후 제목과 내용을 1111 이라고만 적어도 최소 10초가 필요합니다
물론 손빠른 사람은 그보다 빠르게 타이핑이 가능할 수 도 있으나, 극히 이례적인 상황일것으므로 대조군에서 제외하고 10초라는 시간 제한을 두고 그것보다 빠르면 글 작성을 막는 대응 방법 입니다
1-1. 게시글
mobile / skin / board / basic / write.skin.php
skin / board / basic / write.skin.php
<input type="hidden" name="page" value="<?php echo $page ?>">
내용 밑에 추가
<input type="hidden" name="w_time" value="<?php echo time(); ?>">
1-2. 게시글 저장
mobile / skin / board / basic / write_update.skin.php
skin / board / basic / write_update.skin.php
<?php
if (!defined("_GNUBOARD_")) exit;
// 일정시간내에 글 작성하면 스팸글로 차단
if (!$w_time) {
$w_time = time();
}
$spam_time_check = time() - $w_time;
if ($spam_time_check < 10) {
alert('비정상적인 접근입니다.');
exit();
}
2. 메인 페이지 세션이 없는 경우 글쓰기 금지
sir 마르스컴퍼니 님의 팁 : https://sir.kr/g5_tip/16141
extend / spam_deny.php 생성하고 추가
<?php
if (!defined('_GNUBOARD_')) exit; // 개별 페이지 접근 불가
// 메인 페이지를 방문하지 않고 글작성을 시도하는 경우 차단
$spam_deny_checkurl = basename($_SERVER['SCRIPT_NAME']);
if ($spam_deny_checkurl == 'index.php') {
set_session('ss_spam_index_token', true);
}
if ($spam_deny_checkurl == 'write_update.php' || $spam_deny_checkurl == 'write_comment_update.php') {
if (!get_session('ss_spam_index_token')) {
die('허용되지 않은 접근입니다.');
}
}
3. 글 작성자의 이름일때 글쓰기 차단
sir 균이 님의 팁 : https://sir.kr/qa/468232?#answer_468235
3-1. 게시글
mobile / skin / board / basic / write_update.head.skin.php
skin / board / basic / write_update.head.skin.php
<?php
if (!defined("_GNUBOARD_")) exit;
// 작성자 이름이 영어로만 구성된 경우 스팸글로 차단
if($w == '' || $w == 'r') {
if ($member['mb_id']) {
$wr_name = addslashes(clean_xss_tags($board['bo_use_name'] ? $member['mb_name'] : $member['mb_nick']));
} else {
// 비회원의 경우 이름이 누락되는 경우가 있음
$wr_name = clean_xss_tags(trim($_POST['wr_name']));
}
if( isset($wr_name) && !preg_replace("/[a-zA-Z0-9]/",'', $wr_name) ) die;
}
3-2. 댓글
mobile / skin / board / basic / write_comment_update.head.skin.php
skin / board / basic / write_comment_update.head.skin.php
<?php
if (!defined('_GNUBOARD_')) exit; // 개별 페이지 접근 불가
// 작성자 이름이 영어로만 구성된 경우 스팸글로 차단
$w = $_POST["w"];
$wr_name = trim($_POST['wr_name']);
if($w == '' || $w == 'r') {
if ($member['mb_id']) {
$wr_name = addslashes(clean_xss_tags($board['bo_use_name'] ? $member['mb_name'] : $member['mb_nick']));
} else {
// 비회원의 경우 이름이 누락되는 경우가 있음
$wr_name = clean_xss_tags(trim($_POST['wr_name']));
}
if( isset($wr_name) && !preg_replace("/[a-zA-Z0-9]/",'', $wr_name) ) die;
}
4. 해외 아이피 글쓰기 차단
sir 이도훈 님의 팁 : https://sir.kr/qa/391725#answer_391740
데모 : https://www.happyjung.com/demo/php/x-real_ip.php
skin / board / basic / write_update.head.skin.php
<?php
if (!defined("_GNUBOARD_")) exit;
// 해외아이피 글쓰기 차단
$client_ip = isset($_SERVER['HTTP_CLIENT_IP'])?$_SERVER['HTTP_CLIENT_IP']:isset($_SERVER['HTTP_X_FORWARDED_FOR'])?$_SERVER['HTTP_X_FORWARDED_FOR']:$_SERVER['REMOTE_ADDR'];
$details = json_decode(file_get_contents("https://ipinfo.io/{$client_ip}/json"));
if($details->country != "KR"){
alert("Only Korea Accept");
exit();
}
5. hook 이용 자동으로 글 쓰는 스팸 막기 ( 그누보드 5.4.3 이상에만 사용 가능 )
sir thisgun 님의 팁 : https://sir.kr/g5_plugin/10184
extend / spam.write.ban.extend.php 파일 생성후 아래 내용 저장
<?php
if (!defined('_GNUBOARD_')) exit; // 개별 페이지 접근 불가
// hook 이용 자동으로 글 쓰는 스팸 막기
if(!defined('CHECK_WRITEPAGE_SPAM_INPUT_NAME')){
// 아래 상수값 영문소문자+숫자로 되어 있는 부분을 반드시 영문소문자+숫자로 마음대로 변경해주세요.
define('CHECK_WRITEPAGE_SPAM_INPUT_NAME', 'abc123def456ghi');
}
if(!defined('CHECK_WRITEPAGE_SPAM_INPUT_VALUE')){
// 아래 상수값 한글로 되어 있는 부분을 반드시 한글로 마음대로 변경해주세요.
define('CHECK_WRITEPAGE_SPAM_INPUT_VALUE', '대한민국사랑해');
}
add_event('bbs_write', 'g5_check_spam_write_page', 1, 2);
function g5_check_spam_write_page($board, $wr_id){
add_event('tail_sub', 'g5_add_script_write_page_input');
}
function g5_add_script_write_page_input(){
?>
<script>
jQuery(function ($) {
$('<input>').attr({
type: 'hidden',
name: '<?php echo CHECK_WRITEPAGE_SPAM_INPUT_NAME; ?>',
value: '<?php echo CHECK_WRITEPAGE_SPAM_INPUT_VALUE; ?>'
}).appendTo('form[name=fwrite]');
});
</script>
<?php
}
add_event('write_update_before', 'g5_check_spam_write_update_before', 1, 2);
function g5_check_spam_write_update_before($board, $wr_id){
if( isset($_POST[CHECK_WRITEPAGE_SPAM_INPUT_NAME]) && $_POST[CHECK_WRITEPAGE_SPAM_INPUT_NAME] === CHECK_WRITEPAGE_SPAM_INPUT_VALUE ){
return;
} else {
alert("스팸 싫어요");
exit();
}
}
참고자료
https://sir.kr/g5_tip/14663
https://sir.kr/g5_tip/16141
https://sir.kr/qa/468232?#answer_468235
https://sir.kr/g5_plugin/10184
https://sir.kr/qa/391725#answer_391740
댓글목록
등록된 댓글이 없습니다.