is_admin == 'Y') return new Object(); if($grant->manager) return new Object(); } $oFilterModel = &getModel('spamfilter'); // ip가 금지되어 있는 경우를 체크 $output = $oFilterModel->isDeniedIP(); if(!$output->toBool()) return $output; // 금지 단어에 있을 경우 체크 $text = $obj->title.$obj->content; $output = $oFilterModel->isDeniedWord($text); if(!$output->toBool()) return $output; // 지정된 시간 체크, 수정시 제외 if($obj->document_srl == 0){ $output = $oFilterModel->checkLimited(); if(!$output->toBool()) return $output; } // 로그 남김 $this->insertLog(); return new Object(); } /** * @brief 댓글 작성 시간 및 금지 ip/ 단어 처리 루틴 **/ function triggerInsertComment(&$obj) { if($_SESSION['avoid_log']) return new Object(); // 로그인 여부, 로그인 정보, 권한 유무 체크 $is_logged = Context::get('is_logged'); $logged_info = Context::get('logged_info'); $grant = Context::get('grant'); // 로그인 되어 있을 경우 관리자 여부를 체크 if($is_logged) { if($logged_info->is_admin == 'Y') return new Object(); if($grant->manager) return new Object(); } $oFilterModel = &getModel('spamfilter'); // ip가 금지되어 있는 경우를 체크 $output = $oFilterModel->isDeniedIP(); if(!$output->toBool()) return $output; // 금지 단어에 있을 경우 체크 $text = $obj->content; $output = $oFilterModel->isDeniedWord($text); if(!$output->toBool()) return $output; // 지정된 시간 체크 수정이 아닌경우만 if(!$obj->__isupdate){ $output = $oFilterModel->checkLimited(); if(!$output->toBool()) return $output; } unset($obj->__isupdate); // 로그 남김 $this->insertLog(); return new Object(); } /** * @brief 엮인글 작성시 시간 및 ip 검사 **/ function triggerInsertTrackback(&$obj) { if($_SESSION['avoid_log']) return new Object(); $oFilterModel = &getModel('spamfilter'); // 해당 글에 엮인글을 한번 이상 추가하였는지를 확인 $output = $oFilterModel->isInsertedTrackback($obj->document_srl); if(!$output->toBool()) return $output; // ip가 금지되어 있는 경우를 체크 $output = $oFilterModel->isDeniedIP(); if(!$output->toBool()) return $output; // 금지 단어에 있을 경우 체크 $text = $obj->blog_name.$obj->title.$obj->excerpt.$obj->url; $output = $oFilterModel->isDeniedWord($text); if(!$output->toBool()) return $output; // 필터링 시작 $oTrackbackModel = &getModel('trackback'); $oTrackbackController = &getController('trackback'); list($ipA,$ipB,$ipC,$ipD) = explode('.',$_SERVER['REMOTE_ADDR']); $ipaddress = $ipA.'.'.$ipB.'.'.$ipC; // 제목과 블로그이름이 동일할 경우 최근 6시간내의 ip를 조사하여 삭제하고 금지ip로 등록 if($obj->title == $obj->excerpt) { $oTrackbackController->deleteTrackbackSender(60*60*6, $ipaddress, $obj->url, $obj->blog_name, $obj->title, $obj->excerpt); $this->insertIP($ipaddress.'.*'); return new Object(-1,'msg_alert_trackback_denied'); } // 30분 이내에 1개 이상의 한 C클래스의 ip에서 엮인글 등록 시도시 금지 아이피로 지정하고 해당 ip의 글을 모두 삭제 /* 호스팅 환경을 감안하여 일단 이 부분은 동작하지 않도록 주석 처리 $count = $oTrackbackModel->getRegistedTrackback(30*60, $ipaddress, $obj->url, $obj->blog_name, $obj->title, $obj->excerpt); if($count > 1) { $oTrackbackController->deleteTrackbackSender(3*60, $ipaddress, $obj->url, $obj->blog_name, $obj->title, $obj->excerpt); $this->insertIP($ipaddress.'.*'); return new Object(-1,'msg_alert_trackback_denied'); } */ return new Object(); } /** * @brief IP 등록 * 등록된 IP는 스패머로 간주 **/ function insertIP($ipaddress) { $args->ipaddress = $ipaddress; $args->search_target = 'ipaddress'; Context::set('search_target', 'ipaddress'); $args->search_keyword = $ipaddress; Context::set('search_keyword', $ipaddress); $args->start_date = ((int)date('Ymd')-2).'0000'; // 이틀 전 $oDocumentModel = &getModel('document'); $output = $oDocumentModel->getDocumentList($args); $document_list = $output->data; // begin transaction $oDB = &DB::getInstance(); $oDB->begin(); if(is_array($document_list)) { foreach($document_list as $oDocument) { if($oDocument->isExists()) { // 글 삭제 $args->document_srl = $oDocument->document_srl; $output = executeQuery('document.deleteDocument', $args); if(!$output->toBool()) { $oDB->rollback(); return $output; } // 카테고리가 있으면 카테고리 정보 변경 if($oDocument->get('category_srl')) $this->updateCategoryCount($oDocument->get('module_srl'),$oDocument->get('category_srl')); // 신고 삭제 executeQuery('document.deleteDeclared', $args); // 썸네일 파일 제거 FileHandler::removeDir(sprintf('files/cache/thumbnails/%s',getNumberingPath($document_srl, 3))); // commit $oDB->commit(); } } } $oCommentModel = &getModel('comment'); $output = $oCommentModel->getTotalCommentList($args); $comment_list = $output->data; if(is_array($comment_list)) { foreach($comment_list as $oComment) { $comment_srl = $oComment->comment_srl; $comment = $oCommentModel->getComment($comment_srl); if($comment->comment_srl != $comment_srl) return new Object(-1, 'msg_invalid_request'); $document_srl = $comment->document_srl; // 해당 댓글에 child가 있는지 확인 $child_count = $oCommentModel->getChildCommentCount($comment_srl); if($child_count==0) { // begin transaction $oDB = &DB::getInstance(); $oDB->begin(); // 삭제 $args->comment_srl = $comment_srl; $output = executeQuery('comment.deleteComment', $args); if(!$output->toBool()) { $oDB->rollback(); } $output = executeQuery('comment.deleteCommentList', $args); // 댓글 수를 구해서 업데이트 $comment_count = $oCommentModel->getCommentCount($document_srl); // document의 controller 객체 생성 $oDocumentController = &getController('document'); // 해당글의 댓글 수를 업데이트 $output = $oDocumentController->updateCommentCount($document_srl, $comment_count, null, false); if(!$output->toBool()) { $oDB->rollback(); } // commit $oDB->commit(); } } } return executeQuery('spamfilter.insertDeniedIP', $args); } /** * @brief 로그 등록 * 현 접속 IP를 로그에 등록, 로그의 간격이 특정 시간 이내일 경우 도배로 간주하여 * 스패머로 등록할 수 있음 **/ function insertLog() { $output = executeQuery('spamfilter.insertLog'); return $output; } } ?>