<?php
/*
|--------------------------------------------------------------------------------------------------------------
| version 0.24 = 20170303
| 스팸 디펜스
| 수정 또는 업데이트시 버전 업시켜주세요.
|--------------------------------------------------------------------------------------------------------------
*/



/*
|--------------------------------------------------------------------------------------------------------------
| 기본 값 설정
|--------------------------------------------------------------------------------------------------------------
*/
$spamBBS_Tables = "BBS : 040502";		//스팸설정할 게시판을 넣어주세요 예) 한개일때 notice  여러개일때 notice,pds,free,
$spamMemberY_N = "n";										//회원가입 yes no  가입허용 : y, 가입 불허 : n
$spamBBS_Y_N = "y";											//게시판 스팸처리  yes no  허용 : y,  불허 : n
//|----------------------------------------------------------------------------------------------------------------------------------
if(!$is_admin){

	$TimeDelay = "+20 seconds";									//7초 이하로 글을쓰면 현재글 차단

	//|----------------------------------------------------------------------------------------------------------------------------------
	$TimeSecond = "360";											// 120초(2분)전부터 현재까지 글이 5개($spamDelivery ) 올라가면 60분간 차단 (커뮤니티가 활성화되있으면 값을 늘리세요)
	$spamDelivery  = "4";											// 120초(2분)전부터 현재까지 글이 5개($spamDelivery ) 올라가면 60분간 차단 (커뮤니티가 활성화되있으면 값을 늘리세요)
	$spamOverTime  = "+60 minutes";							// 120초(2분)전부터 현재까지 글이 5개($spamDelivery ) 올라가면 60분간 차단
	//|----------------------------------------------------------------------------------------------------------------------------------
	$spamMemberOut = "y";										// 위에 차단된 곳에서 회원이 쓴거라면 회원ID 차단함 (관리자는 위사항 포함 안됨)
	$spamMemberCnt = "7";										// 연속으로 글쓰기하면 차단되는 횟수  무효화하려면 $spamMemberOut ="n" 설정함
	//|----------------------------------------------------------------------------------------------------------------------------------
	//내용 필터링 구분은 , 로 처리됨 일반유저가 에디터 없을때 사용함
	$spamContentFilter=".jpg,.jpeg,.png,.gif,.swf,.pdf,<script,<embed,<object,<link,<param,<iframe,http://,https://,.mp3,.ogg,.wav,.wmv,.avi,.mov,position:";
	//|----------------------------------------------------------------------------------------------------------------------------------
}



/*
|--------------------------------------------------------------------------------------------------------------
| 변수 셋팅
|--------------------------------------------------------------------------------------------------------------
*/
$TimeOut = time();																											//현재 서버시간 셋팅
$spamBBS_Cate = ($g4['bbs']) ? $g4['bbs'] : G5_BBS_DIR ;														//그누보드4와 5인경우 bbs 카테고리 가져옴

$spamNEW_Table = ($g4['board_new_table']) ? $g4['board_new_table'] : $g5['board_new_table'] ;	//그누보드4와 5인경우 board_new 테이블
$spamMEM_Table = ($g4['member_table']) ? $g4['member_table'] : $g5['member_table'] ;			//그누보드4와 5인경우 회원테이블 테이블


$mb_id = $member['mb_id'];

//관리자 또는 그룹관리자는 스팸검사 안함
if ($is_admin == "super" || $is_admin == "group"){
		//관리자는 처리대상이 아님
}else{
	/*
	|--------------------------------------------------------------------------
	| 게시판 처리
	|--------------------------------------------------------------------------
	| 1. 게시판만 처리됩니다.
	| 2. 관리자권한(super, group)은 처리되지 않습니다.
	| 3. 글쓰기만 적용됩니다. 수정은 적용안됨
	*/
	//게시판만 검사함
	if(!$bo_table) $bo_table="noTable";
	if((strpos($spamBBS_Tables, $bo_table) == true) && ($spamBBS_Y_N == "y") && ((!$_POST['w']) || $_POST['w']=="w")){//게시판 & 설정에서 yes  && 게시판 설정한경우 처리함


		/*
		|--------------------------------------------------------------------------
		| 게시판 처리 > 스팸 프로그램에서 쓰기페이지(WRITE.PHP)로 바로 연결하여 쓰기할때
		|--------------------------------------------------------------------------
		| 설정값 없이 바로  exit; 처리됨
		| 이 처리는 메인 또는 리스트에서 글쓰기 등으로 링크 타고 들어오면 걸리지 않지만
		| 주소창으로(프로그램상) 주소치고 들어오면 스팸으로 간주하고 막아버립니다.
		|
		*/
		if(!($_SERVER['HTTP_REFERER']) && (strpos($_SERVER['PHP_SELF'], $spamBBS_Cate."/write.php") == true)){
			echo "스팸처리(이페이지가 보인다면 관리자에게 문의 바랍니다.) code: 001";
			exit;
		}

		/*
		|--------------------------------------------------------------------------
		| 게시판 처리 > 쓰기와 처리페이지간의 시간차 처리
		|--------------------------------------------------------------------------
		| 설정값 $TimeDelay 에 의해(약 7초) 간 write.php 에 머물다 처리페이지로 가야 정상작동됨.
		| 만약 쓰기페이지에 1~2초간 있다가 가면 스팸으로 간주되어 멈추게됩니다.
		| 사람이 정상적으로 쓸경우 최소 10초 이상이라는 가정하에 처리
		*/
		//---------게시판 시간차(withe 페이지에서 write_update.php 까지 가는 시간을 체크하여 차단 예) 쓰기페이지에서 10초 이하로 업데이트 누르면 차단) 차단  시작-------------------
		if((strpos($_SERVER['PHP_SELF'], $spamBBS_Cate."/write.php") == true)){
			set_session('spamTimeOut', strtotime($TimeDelay, $TimeOut));		//5초 이하에서만 처리됨(설정값조정가능)
		}
		if((strpos($_SERVER['PHP_SELF'], $spamBBS_Cate."/write_update.php") == true)){
			//write 페이지에서 구운 spamTimeOut 이 현재 시간보다 크면 차단
			if(get_session('spamTimeOut') > strtotime('+0 seconds', $TimeOut)){
				echo "스팸처리(이페이지가 보인다면 관리자에게 문의 바랍니다.) code: 002";
				exit;
			}
		}

		/*
		|--------------------------------------------------------------------------
		| 게시판 처리 > 같은 아이디로 연속 글쓰기할때 아이디 차단
		|--------------------------------------------------------------------------
		| 같은아이디로 게시판 설정값보다 많이 쓰게되면
		| 스팸 아이디로 갖주하여 아이디 차단 합니다.
		|
		| 설정값($spamMemberOut = y)  회원 차단 유무
		| 글쓰기 횟수 $spamMemberCnt 기본값 약5회
		|
		| 1시간안에 같은 아이디로 약 7 개 이상의 글이 있다면
		*/
		if((strpos($_SERVER['PHP_SELF'], $spamBBS_Cate."/write.php") == true) && ($mb_id)){
			if($spamMemberOut=="y"){
				$spamSql = " select count(*) as spamCnt from $spamNEW_Table where mb_id = '{$mb_id}' and bn_datetime BETWEEN '".date("Y-m-d H:i:s", time()- 3600)."' AND '".date("Y-m-d H:i:s", time())."' ;";

				$spamRow = sql_fetch($spamSql);
				if ($spamRow['spamCnt'] >= $spamMemberCnt){
					$sqlUpdate = " update $spamMEM_Table set mb_intercept_date = '".date("Ymd", $TimeOut)."' where mb_id = '{$mb_id}' ";
					sql_query($sqlUpdate);
					echo "스팸처리(이페이지가 보인다면 관리자에게 문의 바랍니다.) code: 003";
					exit;
				}
			}
		}

		/*
		|--------------------------------------------------------------------------
		| 게시판 처리 > 최신글  카운트하여 차단 시작
		|--------------------------------------------------------------------------
		| 새로운 글이 120에($TimeSecond (단위 초)) 5개($spamDelivery (단위 갯수))  이상 올라오면 스팸설정된
		| ($spamOverTime(단위 분)) 리스트 게시판 1~2시간 차단 처리
		|
		| 설정값($spamMemberOut = y)
		| 회원일경우(보통 스팸이 회원가입후 쓰는경우가 많음) 위 해당사하이면 회원 차단 / 나중에 관리자에서 복구 가능
		*/
		if((strpos($_SERVER['PHP_SELF'], $spamBBS_Cate."/write_update.php") == true)){
			if(get_session('spamTimeOutTable') >= strtotime('+0 seconds', $TimeOut)){	//설정된 게시판은  시간안에는 글 올릴수 없음
				echo "스팸처리(이페이지가 보인다면 관리자에게 문의 바랍니다.) code: 005";
				exit;
			}

			$spamSql = " select count(*) as spamCnt from $spamNEW_Table where bo_table = '{$bo_table}' and bn_datetime BETWEEN '".date("Y-m-d H:i:s", time()- $TimeSecond)."' AND '".date("Y-m-d H:i:s", time())."' ;";
			$spamRow = sql_fetch($spamSql);
			if ($spamRow['spamCnt'] >= $spamDelivery){
				//새로운 글이 2분에 5개 이상 올라오면 스팸설정된 $spamBBS_Tables 리스트 게시판 1~2시간 차단 처리
				set_session('spamTimeOutTable', strtotime($spamOverTime, $TimeOut));		//테이블 접근불가 시간 설정

				echo "스팸처리(이페이지가 보인다면 관리자에게 문의 바랍니다.) code: 006";
				exit;
			}
		}

	}

	/*
	|--------------------------------------------------------------------------
	| 회원가입 차단 시작
	|--------------------------------------------------------------------------
	| spamMemberY_N 설정파일에서 y 인경우만 작동됨
	| 회원가입이 없는 사이트만 해당함
	| 회원가입 1단계(회원약관,보호정책) 2단계(회원폼), 3단계(회원정보 업데이트) 모두 차단합니다.
	*/
	if($spamMemberY_N != "y"){	//설정에서 YES NO 설정
		if((strpos($_SERVER['PHP_SELF'], $spamBBS_Cate."/register.php") == true) || (strpos($_SERVER['PHP_SELF'], $spamBBS_Cate."/register_form.php") == true) || (strpos($_SERVER['PHP_SELF'], $spamBBS_Cate."/register_form_update.php") == true)) {
			echo "회원가입 NO  code: 100";
			exit;	//회원가입 마지막업데이트 막기
		}
	}

	/*
	|--------------------------------------------------------------------------
	| 회원자동 차단
	|--------------------------------------------------------------------------
	| member 테이블 리스트중 mb_password 가 동일한 count 가 설정된값보다 많으면 자동차단
	| 정상적인 유저인경우 mb_password 가 동일한 경우는 극히드물며 스팸자동회원가입인경우 동일 패스워드를 많이 사용합니다.
	|
	| member 테이블 리스트중 mb_ip 가 동일한 count 가 설정된값보다 많으면 자동차단
	| mb_ip는 유니크값이나(물론 회사단체인경우는 동일할 수 있음) 스팸회원일경우는 상단수 동일함
	|
	| member 테이블 중 패스워드와 and 아이피가 동일한경우는 거이 없는 관계로 이부분을 차단합니다.
	*/

}
?>