웹마스터 팁

제가 적용해보고 일주일 본 상태인데 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();
 
    // 넘어온 모든 변수중에서 몇가지 불필요한 것들 삭제
제목 글쓴이 날짜
첨부파일 100% 에서 사라지는 문제 저도 해결 [2] 안나오네 2010.06.09
XE 1.5.1 업그레이드시 조심해야 [1] 소걸음 2011.12.23
제로보드4에서 XE로 넘어와 헤메는 분들을 위해서(1편)-Xe개념이해와 설치 [16] file 황비 2010.03.18
제로보드4에서 XE로 넘어와 헤메는 분들을 위해서(3편:최종)-Widgets이해와 활용 [24] 황비 2010.03.26
XE를 다른 호스팅업체로 이전하기 (서버이전) [8] file Gekkou 2010.02.03
우분투 10.04 LTS, apache+php+mysql 설치하기(컴파일 안하고!) [1] fsfsdas 2011.02.20
외부페이지에서 롤오버오류 !! oem팩토리 2012.01.03
XE 1.5.1.1 업데이트후 갑자기 댓글 에디터가 나오지않는 문제 해결팁 [3] 재주꾼 2012.01.02
페이지 설정, 꼭 이렇게 해두세요 [10] file 老姜君 2010.10.14
XE에서 Context의 이해 [3] 우진홈 2011.12.28
확정변수 로 프린트 페이지 꾸미기(/print_page.html) 세상의지배자 2011.12.26
XE 애드온 개발하기 우진홈 2011.12.24
무분별한 스팸글 등록으로부터 임시해결 팁 [15] file 라르게덴 2010.08.12
오른쪽 마우스 사용 금지하기 [15] Fursys 2008.05.28
[마지막팁] 제로보드4 처럼 레이아웃 없이 XE로 나만의 홈페이지 만들기 [6] Gekkou 2010.03.08
코어 1.5.1에서 회원목록에 성별아이콘 쓰기(수정) 늘푸른이 2011.12.10
계정 용량 측정 소스 (펌) [1] file rjsoo 2011.12.16
제로보드 xe 쇼핑몰 오늘본 상품 퀵메뉴 만드는 법 알려주세요 유유히 2011.12.15
1.5 에서 기존 로그인 스킨 이메일 로그인 구동시키기 [1] 쿨키드 2011.11.01
외부에서 단독으로 xe게시판에 글 올리기, blogapi 기능 사용하여, [6] file 김기철980 2011.01.27