웹마스터 팁

제가 적용해보고 일주일 본 상태인데 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();

            // 넘어온 모든 변수중에서 몇가지 불필요한 것들 삭제
제목 글쓴이 날짜
2차 메뉴가 없을 경우 왼쪽 메뉴 숨기기 [5] file 엔시아- 2009.07.16
트리메뉴(dtree) 대충 정리 [11] file 한이73 2009.07.19
까오천사님의 만기일 팁을 1.2.4에 맞게 수정했어요. [15] file 도파 2009.08.27
http://www.도메인주소/~as/xe/ 로 로그인 접속후~ [3] wjnam 2009.09.07
특정그룹회원에게 서비스 제공하기 [4] 똑디 2009.09.12
XE 서버 이전할 때 통채로 압축해서 옮기는 완벽한 방법-로그인, 첨부파일문제 해결 [5] 웰빙샵 지영 2009.09.15
로그인이 안되거나 첨부파일이 등록이 안될때. [9] 똑디 2009.09.30
-추가- 당신의 XE 기반 홈페이지를 훅가게 하는 방법 4가지 [26] 老姜君 2009.10.08
로그인 폼에 관리자는 [Admin] 나타나게 하기 [4] file 오스카 2009.10.10
게시판 리스트에서 확장변수를 카테고리처럼 보여주기 [11] file 고진감래 2009.11.05
ZB4로 현재까지 사이트를 운영하는분들 긴급 상황안내 (???) [2] DuRi 2009.11.20
메인 레이아웃에서 로그인이 안보이는 경우. 김찬회425 2009.12.06
회원과 비회원 구분하여 출력하기 [6] NEARSTORY 2009.12.26
Flash swf 플래쉬 때문에 로그인이나 메뉴가 감추어졌을때에... [5] file 태림씨야! 2010.01.23
로그인페이지와 새페이지 연결법 [2] poko 2010.01.30
쉬운 설치 - unexpected error 메시지창이 뜰 때 [9] 현의느낌 2010.01.30
외부프로그램에서 제로보드 xe 및 그누보드 회원 연동(로그인) 하기 - 초간단 [1] 한이73 2010.02.03
로그인 후 특정 그룹 페이지 가기 다른버전 [9] 눈물많은OrOi 2010.02.22
초보자를 위한 제로보드에 애드온 프로그램 설치하기 강좌 이하늘690 2010.02.23
플래시 뒤로 로그인창 숨는 문제 [5] 김지훈295 2010.02.25