웹마스터 팁
무분별한 스팸글 등록으로부터 임시해결 팁
2010.08.12 21:59
제가 적용해보고 일주일 본 상태인데 1건도 스팸 등록되지 않았습니다.
당연히 스팸 공격이 자주당했던 곳을 비회원 작성으로 풀었는데도 입니다.
준비물
xe/modules/board/board.controller.php
xe/modules/editor/skins/스킨명/editor.html
사용하시는, 스팸 등록이 이루워지는 모듈의 에디터 스킨을 무엇으로 설정하셨는지 확인하신후 해당 폴더로 이동해서 editor.html 파일을 편집기로 엽니다.
제일 최상줄에 아래를 추가합니다.
<input type="hidden" name="{base64_encode($request_uri.date('Ymd'))}" value="Y" />
board.controller.php 파일을 편집기로 엽니다.
procBoardInsertDocument(), procBoardInsertComment() 함수를 검색합니다.
/** * @brief 문서 입력 **/ function procBoardInsertDocument() { // 권한 체크 if($this->module_info->module != "board") return new Object(-1, "msg_invalid_request"); if(!$this->grant->write_document) return new Object(-1, 'msg_not_permitted'); $logged_info = Context::get('logged_info'); // 글작성시 필요한 변수를 세팅 $obj = Context::getRequestVars(); /* 스팸 대응 2010.08.05 */ if($obj->{strtolower(base64_encode(Context::getRequestUri().date('Ymd')))} != 'Y') return new Object(-1, 'msg_not_permitted'); $obj->module_srl = $this->module_srl; if($obj->is_notice!='Y'||!$this->grant->manager) $obj->is_notice = 'N';
/** * @brief 코멘트 추가 **/ function procBoardInsertComment() { // 권한 체크 if(!$this->grant->write_comment) return new Object(-1, 'msg_not_permitted'); $logged_info = Context::get('logged_info'); // 댓글 입력에 필요한 데이터 추출 /* 스팸 대응 2010.08.05 */ $obj = Context::gets('document_srl','comment_srl','parent_srl','content'+ ','password','nick_name','member_srl','email_address','homepage','is_secret','notify_message',strtolower(base64_encode(Context::getRequestUri().date('Ymd')))); $obj->module_srl = $this->module_srl; /* 스팸 대응 2010.08.05 */ if($obj->{strtolower(base64_encode(Context::getRequestUri().date('Ymd')))} != 'Y') return new Object(-1, 'msg_not_permitted'); // 원글이 존재하는지 체크 $oDocumentModel = &getModel('document'); $oDocument = $oDocumentModel->getDocument($obj->document_srl); if(!$oDocument->isExists()) return new Object(-1,'msg_not_permitted');
스팸 대응이라는 주석문 바로 밑에 것들을 추가 또는 수정하세요.
테스트는 위 내용을 모두 적용 후 캐쉬 재생성 하시고 테스트하려는 모듈로 가셔서 에디터 스킨을 위 내용 추가하지 않은 에디터로 임시로 바꾸세요. 그리고 로그인 상태로 글 등록을 하세요.
권한에 의한 오류 팝업이 나오면 성공입니다.
XML, BlogApi도 권한 오류를 내뿜습니다.
XML, BlogApi에서 본인의 홈페이지로 글을 써야겠다고 하시는 분들은 어쩔 수 없어요.
board.controller.php 수정 어려우신 분들은 첨부파일로 올려두겠습니다.
꼭 미리 기존에 있던 파일을 백업 받으신 후 덮어씌워주세요.
-- 2010.08 16 추가 --
-- 2011.05 09 수정 --
회원 가입 부분에도 추가합니다.
./modules/member/skins/스킨명/signup_form.html
id가 fo_insert_member로 되어있는 <form> 태그 바로 밑에 아래를 추가하세요.
<input type="hidden" name="{base64_encode($request_uri.date('Ymd'))}" value="Y" />
./modules/member/member.controller.php
procMemberInsert() 함수안에 스팸 대응이라는 주석문이 있는곳을 추가, 수정하세요.
/** * @brief 회원 가입 **/ function procMemberInsert() { if(Context::getRequestMethod() == "GET") return new Object(-1, "msg_invalid_request"); $oMemberModel = &getModel('member'); $config = $oMemberModel->getMemberConfig(); // before 트리거 호출 $trigger_output = ModuleHandler::triggerCall('member.procMemberInsert', 'before', $config); if(!$trigger_output->toBool()) return $trigger_output; // 관리자가 회원가입을 허락하였는지 검사 if($config->enable_join != 'Y') return $this->stop('msg_signup_disabled'); // 약관에 동의하였는지 검사 (약관이 있을 경우만) if($config->agreement && Context::get('accept_agreement')!='Y') return $this->stop('msg_accept_agreement'); // 필수 정보들을 미리 추출 /* 스펨 대응 2010.08.13 */ $args = Context::gets('user_id','user_name','nick_name','homepage','blog','birthday','email_address','password','allow_mailing','find_account_question','find_account_answer',strtolower(base64_encode(Context::getRequestUri().date('Ymd')))); /* 스펨 대응 2010.08.13 */ if($args->{strtolower(base64_encode(Context::getRequestUri().date('Ymd')))} != 'Y') return new Object(-1, 'msg_invalid_request'); $args->member_srl = getNextSequence(); // 넘어온 모든 변수중에서 몇가지 불필요한 것들 삭제