제가 적용해보고 일주일 본 상태인데 1건도 스팸 등록되지 않았습니다.
당연히 스팸 공격이 자주당했던 곳을 비회원 작성으로 풀었는데도 입니다.
준비물
xe/modules/board/board.controller.php
xe/modules/editor/skins/스킨명/editor.html
사용하시는, 스팸 등록이 이루워지는 모듈의 에디터 스킨을 무엇으로 설정하셨는지 확인하신후 해당 폴더로 이동해서 editor.html 파일을 편집기로 엽니다.
제일 최상줄에 아래를 추가합니다.
1 | < input type = "hidden" name = "{base64_encode($request_uri.date('Ymd'))}" value = "Y" /> |
board.controller.php 파일을 편집기로 엽니다.
procBoardInsertDocument(), procBoardInsertComment() 함수를 검색합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | /** * @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' ; |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | /** * @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> 태그 바로 밑에 아래를 추가하세요.
1 | < input type = "hidden" name = "{base64_encode($request_uri.date('Ymd'))}" value = "Y" /> |
./modules/member/member.controller.php
procMemberInsert() 함수안에 스팸 대응이라는 주석문이 있는곳을 추가, 수정하세요.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | /** * @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(); // 넘어온 모든 변수중에서 몇가지 불필요한 것들 삭제 |