|
|
동네 사람들의 정담이 오고가는 대청마루입니다. 무슨 글이든 좋아요. |
http://www.xpressengine.com/tip/19069968
제가 적용해보고 일주일 본 상태인데 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() 함수를 검색합니다.
01.
/**
02.
* @brief 문서 입력
03.
**/
04.
function
procBoardInsertDocument() {
05.
// 권한 체크
06.
if
(
$this
->module_info->module !=
"board"
)
return
new
Object(-1,
"msg_invalid_request"
);
07.
if
(!
$this
->grant->write_document)
return
new
Object(-1,
'msg_not_permitted'
);
08.
$logged_info
= Context::get(
'logged_info'
);
09.
// 글작성시 필요한 변수를 세팅
10.
$obj
= Context::getRequestVars();
11.
/* 스팸 대응 2010.08.05 */
12.
if
(
$obj
->{
strtolower
(
base64_encode
(Context::getRequestUri().
date
(
'Ymd'
)))} !=
'Y'
)
return
new
Object(-1,
'msg_not_permitted'
);
13.
$obj
->module_srl =
$this
->module_srl;
14.
if
(
$obj
->is_notice!=
'Y'
||!
$this
->grant->manager)
$obj
->is_notice =
'N'
;
01.
/**
02.
* @brief 코멘트 추가
03.
**/
04.
function
procBoardInsertComment() {
05.
// 권한 체크
06.
if
(!
$this
->grant->write_comment)
return
new
Object(-1,
'msg_not_permitted'
);
07.
$logged_info
= Context::get(
'logged_info'
);
08.
// 댓글 입력에 필요한 데이터 추출
09.
/* 스팸 대응 2010.08.05 */
10.
$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'
))));
11.
$obj
->module_srl =
$this
->module_srl;
12.
/* 스팸 대응 2010.08.05 */
13.
if
(
$obj
->{
strtolower
(
base64_encode
(Context::getRequestUri().
date
(
'Ymd'
)))} !=
'Y'
)
return
new
Object(-1,
'msg_not_permitted'
);
14.
15.
// 원글이 존재하는지 체크
16.
$oDocumentModel
= &getModel(
'document'
);
17.
$oDocument
=
$oDocumentModel
->getDocument(
$obj
->document_srl);
18.
if
(!
$oDocument
->is Exists())
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() 함수안에 스팸 대응이라는 주석문이 있는곳을 추가, 수정하세요.
01.
/**
02.
* @brief 회원 가입
03.
**/
04.
function
procMemberInsert() {
05.
if
(Context::getRequestMethod() ==
"GET"
)
return
new
Object(-1,
"msg_invalid_request"
);
06.
$oMemberModel
= &getModel(
'member'
);
07.
$config
=
$oMemberModel
->getMemberConfig();
08.
// before 트리거 호출
09.
$trigger_output
= ModuleHandler::triggerCall(
'member.procMemberInsert'
,
'before'
,
$config
);
10.
if
(!
$trigger_output
->toBool())
return
$trigger_output
;
11.
// 관리자가 회원가입을 허락하였는지 검사
12.
if
(
$config
->enable_join !=
'Y'
)
return
$this
->stop(
'msg_signup_disabled'
);
13.
// 약관에 동의하였는지 검사 (약관이 있을 경우만)
14.
if
(
$config
->agreement && Context::get(
'accept_agreement'
)!=
'Y'
)
return
$this
->stop(
'msg_accept_agreement'
);
15.
// 필수 정보들을 미리 추출
16.
/* 스펨 대응 2010.08.13 */
17.
$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'
))));
18.
/* 스펨 대응 2010.08.13 */
19.
if
(
$args
->{
strtolower
(
base64_encode
(Context::getRequestUri().
date
(
'Ymd'
)))} !=
'Y'
)
return
new
Object(-1,
'msg_invalid_request'
);
20.
21.
$args
->member_srl = getNextSequence();
22.
// 넘어온 모든 변수중에서 몇가지 불필요한 것들 삭제
최신댓글