[워드프레스] 플러그인없이 스팸 댓글 차단하기
워드프레스로 블로그를 운영하다 보면 골치 아픈 일 중의 하나가 바로 스팸 댓글일 것입니다.
스팸을 방지하는 방법으로는
- 댓글 기능을 아예 사용하지 않음
- 로그인한 사용자만 댓글 달도록 허가
- 키워드 필터링
- 링크가 포함된 댓글을 제한 또는 금지
- 관리자가 수동으로 승인
등의 여러 가지 방법이 있습니다.
댓글 기능을 아예 사용하지 않는 것이 가장 강력하긴 하지만, 방문자와의 소통을 원하시는 분들은 해당이 안 되겠지요.
다른 방법으로는 스팸 댓글을 막아주는 플러그인을 사용하거나 구글의 reCAPTCHA를 적용하는 방법도 있습니다.
요즘에는 워드프레스를 처음 설치하면 akismet(아키스밋)라는 플러그인이 자동으로 설치되어 있는데, akismet 플러그인은 효과적이고 평판이 좋아서 많은 사람들이 이용하고 있습니다.
다만 저의 경우, 개인적으로 내가 직접 기능을 추가할 수 있는 것으로 대체가 가능하다면 플러그인을 쓰지 않으려고 하는 성격입니다.
플러그인을 여러 개 사용하면 블로그가 느려지는 경향이 있다는 것도 이유 중의 하나입니다.
플러그인을 사용해서 자동으로 휴지통이나 스팸함으로 보내주는 것은 편하긴 한데, 저는 이 쓰레기 같은 스팸 글들이 내 데이터베이스 안으로 들어오는 것조차 싫습니다.
그래서 저는 이 방법을 쓰고 있습니다.
한국어로 블로그를 운영 중이시고, 플러그인을 싫어하신다면 아래의 코드로 어느 정도 스팸 차단이 가능합니다.
function.php 파일에 코드 추가
functions.php 파일을 잘못 수정하면 아래와 같은 메세지를 뿜어내면서 블로그가 작동하지않게 될 수 있습니다. 반드시 백업하신 후에 수정하시기 바랍니다.
functions.php 파일에 아래의 코드를 추가합니다.
add_filter( 'preprocess_comment', function( $commentdata ) {
$comment_content = $commentdata['comment_content'];
$is_spam = false;
if (! preg_match("/[\x{1100}-\x{11FF}\x{3130}-\x{318F}\x{AC00}-\x{D7AF}]+/u", $comment_content)) { // 한글이 포함되어 있는지 체크
$is_spam = true;
}
if ( $is_spam ) {
wp_die(
'<p><strong>댓.글.등.록.실.패</strong>: 한.국.어.문.장.을.입.력.해.주.세.요.</p>',
__( 'Comment Submission Failure' ),
array(
'back_link' => true
)
);
}
return $commentdata;
}, 2 );
코드 해석
preprocess_comment를 후크해서 필터링
add_filter( ‘preprocess_comment’, array $commentdata )형태로 댓글이 데이터베이스에 삽입되기 직전에 필터링 처리를 합니다.
if 조건문 (한글이 포함되어있는지 체크)
6번 라인 if문에서, 댓글 속에 한글이 포함되어 있는지 체크합니다. 자음만 있거나 모음만 있는 경우도 포함합니다.
- ㄱㄴㄷㄹㅁㅂㅅㅇㅈㅊㅋㅌㅍㅎ (O)
- ㅏㅣㅜㅔㅗ (O)
/[\x{1100}-\x{11FF}\x{3130}-\x{318F}\x{AC00}-\x{D7AF}]+/u는 한글이 포함되어 있는지 체크하는 정규식입니다. 이 부분을 수정하면 원하시는 대로 조건을 변경할 수 있습니다.
정규식 출처 : https://funyphp.com/archive/php/29
제가 한글만 체크하는 이유는 워드프레스의 스팸 댓글들은 제 경험상 95% 이상이 외국어로 작성되어 있기 때문입니다. 그래서 한글이 한 글자라도 포함되어 있지 않다면 스팸으로 간주하도록 했습니다.
wp_die 함수 (워드프레스 실행 종료)
스팸으로 판단되었다면 wp_die함수를 사용해서 에러메세지를 출력하고 워드프레스를 강제 종료 시킵니다.
에러 메세지를 댓.글.등.록.실.패: 한.국.어.문.장.을.입.력.해.주.세.요.처럼 글자마다 점을 찍은 이유는 번역기가 기능하지 못하게 하기 위함입니다.
어차피 스팸 댓글들은 봇을 사용하기 때문에 저 문장을 번역할 일이 없겠지만, 그냥 저의 자기만족입니다. 편하신대로 수정하시면 됩니다.
문장을 번역하고 있는 게 아닌가하는 의구심이 들기 시작했습니다. 이 포스팅의 방법을 적용하고나서 4개월 정도 지난 시점에 한국어로 번역된 스팸글이 13개 나왔습니다. 지금은 아래처럼 변경했습니다.
__( 'Comment Submission Failure’ )는 윈도우창의 제목 부분입니다. 워드프레스의 사이트 언어가 한국어인 경우, 댓글 제출 실패라고 자동으로 번역됩니다.
array( 'back_link’ => true )는 이전화면으로 돌아가는 링크를 표시할 건지를 설정합니다.
정리
저는 2월 8일 오후부터 적용하기 시작했는데, 매일 한 두 건씩 달리던 스팸 댓글이 아직까지는 한 건도 달리고 있지 않습니다. 아직은 더 두고 봐야겠지요.
제가 적용한 코드는 단순히 한글이 한 글자도 없는 댓글만 필터링 하기 때문에 정확도는 떨어질 수 있다는 게 유일한 단점일 듯 싶습니다.
그럼에도 불구하고 위의 코드를 사용하는 장점에 대해 언급하자면
- 복사와 붙여넣기 신공으로 쉽게 적용
- 데이터베이스에 삽입되기전에 차단
- 플러그인이나 리캡챠를 설정할 때의 API keys 등이 필요없음
- 속도 저하가 없다
등이 있곘네요.
포스팅 초반에 언급한 것처럼 플러그인이나 리캡챠를 적용하시면 아무래도 여러 조건들을 조합해서 스팸들을 필터링 해주기 때문에 효율면에서는 더 좋을 것입니다. 속도면에서는 좀 애매하겠지만.
저처럼 플러그인 싫어하시는 분들은 한 번 시도해보셔도 괜찮지 않나 싶습니다.
코드 적용 후
이 코드 적용후 약 2주일이 지난 2024년 2월 20일 현재, 아직 스팸댓글 1건도 달리지 않고 있습니다.
댓글 알림 이메일이 와서 오랜 만에 블로그에 접속했습니다.
약 2개월이 지난 2024년 4월 17일 현재, 여전히 스팸글은 1건도 달리지 않았습니다.
간만에 포스팅하려고 접속했더니 2주전에 스팸댓글이 하나 달려 있었습니다.
봇이 한 건지, 사람이 한 건지는 모르겠습니다만, 와~ 허를 찔렸습니다.
아바타 옆의 이름은 체크를 안 해서 상관이 없는데, 댓글안에 한글이름 넣는 것은 필터링하지 못했네요.
이거는 그냥 수동 삭제할 수 밖에 없네요~
지난 6월에 체크한 이후 또 2달이 지났습니다. 스팸 댓글이 13개 쌓여있었습니다.
번역기 돌린 스팸댓글이 나와서 댓글란에 한글이 포함되어있는지 체크하는 것만으로는 더이상 스팸을 걸러낼 수 없게 되었습니다.
공통점을 몇 개 발견하여 스팸을 걸러내는 필터를 몇 가지 추가했습니다. 어떤 걸 추가했는지는 여기에 작성하지 않으려고 합니다.
한글이 없는 댓글만 걸러내겠다고 포스팅한 것이, 스패머들한테 힌트를 준 건 아닌가싶기도 하네요. 설마~ 그렇게까지?하는 생각도 들지만 입조심하는 게 좋을 것 같습니다. 😀
Discussion
New Comments
No comments yet. Be the first one!