로그인 스팸 대응 하기 (2)

[ 이글은 2018년 06월 13일에 최종 수정되었습니다. ]
§

저번주 글과 이어지는 글 입니다.

http://hackya.com/kr/로그인-스팸-대응-하기/

banner-772x250

몹시 고난스러운 주말을 보낸 관계로 상세한 설명 드리기 힘듭니다.

하.. 1시간 반 후면 이번 주말이 끝이 나는군요.

시간적 압박도 있고, 죄송하지만 글을 간략하게 쓰겠습니다.

저번주 설명드린 내용이, 일단 crawler 가 wp-login.php 페이지에 도달했을때, 그냥 멍때리고 있거나, 가짜 로그인 페이지로 자동 redirect 되게 하는거 였습니다.

그러니까 wp-login.php 에서 crawler 가 되었던 사람이 되었던, 어느 누구도 로그인을 할수 없도록 그 페이지를 불능화 시킨거였죠.

그럼 crawler 가 스팸로그인을 하려는 시도를 원천적으로 봉쇄하게 된거라서, 스팸로그인으로 인한 엄청난 트래픽 증가의 걱정으로 부터 벗어나게 됩니다.

(거의 대다수의 워드프레스 사이트 운영자들은, 자신들의 사이트 트래픽이 어디서 발생하는지도 모르고, 이 스팸로그인 문제를 파악하지 못하시더라구요. 돈이 어디서 줄줄 세고 있는지도 모르고 계신거죠.)

암튼, 일단 저번주말 작성한 코드 정리좀 하고, 추가 코딩하고 돌아와서 다시 글을 쓰겠습니다.

헐… 저번주말 작성한 파일이 어디있는지 부터 찾아야 하네요….

저번주에 여기까지 했었네요.

아래 스크립트가 crawler 나 사람이 로그인 페이지에 접근했을 시, 가짜 로그인 페이지로 이동하게 해주는 스크립트 입니다.

 // 현재 페이지 global
  global $pagenow;
    // $_GET['action'] 인지 확인 후, 그렇다면 $action variable 을 set
    $action = (isset($_GET['action'])) ? $_GET['action'] : '';
    // 현재 로그인 페이지에 있는지 확인 && (그리고) action 이 'logout' 이 아닌지도 확인필요
	  // 만약 현재 페이지가 로그인 페이지 이고, action 이 "logout' 이 아니라면
    if( $pagenow == 'wp-login.php' && ( ! $action || ( $action && ! in_array($action, array('logout', 'lostpassword', 'rp'))))) {
        // 블로그 홈페이지/첫페이지로 이동
        $page = get_bloginfo('url');
        // 그리고 가짜 로그인 페이지로 이동
			 wp_redirect('http://hackya.com/login');
        exit();
    }

이제 front-end (브라우져) 쪽에서나 서버쪽에서나 (php) 로그인 페이지에서의 로그인 시도 자체가 완벽히 막혔습니다.

이럼 끝난건가요? 아니죠. 이렇게하고 끝내면 관리자도 로그인을 하지 못해 문제가 생기죠. ㅋㅋㅋ

별도의 로그인 창을 만들어 줘야 합니다.

시간 관계상 별도의 로그인 페이지 보다 저는 child 테마의 header.php 에다가 로그인 창을 하나 만들겠습니다.

<?php 
// 만약 벌써 로그인 상태면 
if ( is_user_logged_in() ) {
echo '<span>안뇽</span>';
} else {
//로그인 된 상태가 아니면 로그인 창 생성
    wp_login_form();
}
 ?>

이제 관리자는 header.php 에 달린 로그인 창을 통해 로그인 하면 됩니다.

끝.

아, 작동되는지 확인해 봐야죠.

잘 됩니다.

logged_in

로그인 되어 있는 상태니 제가 echo 로 출력한 “안뇽” 이란 글씨가 보이고,로그아웃 된 상태에서는 로그인 창이 보이고.

logged_out

이런식으로 로그인 스팸/로그인 공격을 막으시면 됩니다.

너무 어렵다구요? 뭐가 뭔지 모르겠다구요?

그럼 어떻게 하셔야 하죠?

네 맞습니다. 플러그인!! 플러그인을 사용하시면 됩니다!!!

https://wordpress.org/plugins/wps-hide-login/

플러그인 사용하면 사이트도 무거워지고, 그래서 플러그인 사용보다 이렇게 간략하게 스크립트를 짜서 쓰고 싶으신 분들은 이메일 주세요. 원 파일 보내드리겠습니다. 다음주말 까지 기다리시면 로그인 창도 toggle 로 작동하게 예쁘게 만들어서 보내드리겠습니다. ㅋㅋㅋ

hackya 는

Attorney, front-end developer, digital media artist, WordPress enthusiast, & a father of 4 wonderful children.

Tags: , , ,

카테고리: , ,

Ω

11 Comments

  • korbuddy.com says:

    오호랏! 전에 글에 이은 2편 포스팅 해주셨네요 ㅎㅎ

    지금 cleantalk 플러그인 결제해서 사용중인데, 기간 끝나면 재결제 하지 않고 메튜님이 알려주신
    방법으로 차단시켜 봐야겠어요! ㅎㅎ

    항상 재밋게 잘 읽고 있어요~ 오늘도 하나 배우고 갑니다! ㅎㅎ

    • Matthew says:

      Korbuddy 님이 사용중이신 테마에 작성한거니 child 테마에 css 작업을 예쁘게 해서 소스코드 보내드릴께요. ㅎㅎ

      child 테마를 쓰고 있지 않으신데, 테마에 수정을 하실때는 꼭 child 테마를 쓰셔야 합니다. 그렇지 않으면 업데이트를 받게되면 수정한 부분이 모두 날아가 버리거든요.

      재미있고 + 흥미롭고 + 유익한 포스팅들 잘 읽고 있습니다. 애드센스 광고도 생각날때마다 한번씩 눌러드리고 있구요. ㅋㅋㅋ

      • korbuddy.com says:

        아이코 저 하나때문에 괜히 고생하시지 마세요 ㅠㅠ 이미 많은 도움 받았답니다 ㅠ

        차일드테마를 사용하지 않으면 업데이트시 수정한 부분이 모두 날라가게 되는군요,,, 전 그냥 오류방지용인줄 알았는데 그보다 훨씬 더 큰 이유가 있었네요 ㅠ

        차일드테마를 사용하면 차일드테마의 업데이트는 더 이상 이루어 지지 않게 되는건가요? 격에 맞지 않는 질문 죄송합니다 ㅠㅠ

        • Matthew says:

          “격에 맞지 않는 질문 죄송합니다 ㅠㅠ” – Sorry for asking a dumb question. 이란말을 한국어로 이렇게 하는거군요. ㅋㅋㅋ

          저도 하나 배웠습니다.

          There is no such thing as a dumb question. 이라고 제가 답변을 해야 하는데, 이걸 한국어로 어떻게 써야할지 모르겠습니다.

          차일드테마는.. 차일드 라고 한국어로 쓰니까 왠지 이상합니다. ㅠㅠㅠㅠ 자식테마라고 하는게 어떨까요?

          자식도 이상하네요.. >.<

          암튼 child 테마는 저자가 본인, 그러니까 Korbuddy 님이시기 때문에 업데이트가 될수 가 없죠. 오로지 Korbuddy 님만이 child 테마를 업데이트 하실 수 있습니다.

          • WordCracker says:

            좋은 표현 배웠습니다. Sorry for asking a dumb question…

            한자 표현에 “우문”이라는 단어가 있습니다. 아마 “a dumb question”이 여기에 들어맞는 표현 같습니다.

            우문현답(愚問賢答) – 어리석은 질문(stupid question)에 현명한 대답(wise answer)을 할 때 사용되는 표현입니다.

            Child라는 용어가 IT에서 “하위”라고도 많이 번역됩니다. Parent는 상위… 상위 테마, 하위 테마라고 해도 되겠지만, 워드프레스 업계에서는 부모 테마, 자식 테마 정도로 사용되고 있네요.

            “차일드 테마”라는 용어도 사용되고요. 차일드 테마라고 사용하면 부모 테마도 “패어런트 테마”라고 해야 parallel 구조가 맞겠죠. 하지만 그런 용어는 사용하지 않네요.

          • Matthew says:

            “차일드 테마라고 사용하면 부모 테마도 “패어런트 테마”라고 해야 parallel 구조가 맞겠죠. 하지만 그런 용어는 사용하지 않네요.” – 애미애비도 없는 테마는 아닌데… 그렇네요.ㅋㅋㅋ

          • korbuddy.com says:

            메튜님의 댓글을 읽고 난 후 곰곰히 생각을 해보니,
            너무나 당연한 것을 당당하게 질문한 것 같아서 부끄러워집니다 ㅎㅎㅎ
            언제나 친절한 설명 감사합니다!

    • WordCracker says:

      korbuddy님 홈페이지를 보니까 일반인이 회원등록을 하지 못하도록 설정되어 있네요.
      이 경우 관리자만 로그인하면 되므로 허용되는 IP를 등록하여 등록된 IP에서만 로그인이 가능하도록 하는 방법도 좋을 듯합니다(http://www.thewordcracker.com/intermediate/hide-wordpress-login-page/ 참고).
      다음과 같은 코드를 .htaccess 파일에 추가하면 아래에 Allow from 다음에 등록된 IP만 로그인이 가능해집니다.

      <Files wp-login.php>
      Order Deny,Allow
      Deny from All
      Allow from xxx.xxx.xx.xxx
      </Files>

      • Matthew says:

        이게 생각보다 불편한게, 거의 대부분의 사람들이 인터넷을 항상 고정되어 있는 IP 에서 접속하는 경우가 드물거든요.

        사무실/회사 말고, 집에서도 본인의 사이트에 접속해야 하는 경우도 있고, 업무/보안 때문에 VPN 을 사용하는 경우도 있습니다. VPN 의 경우 주기적으로 IP 가 바뀌는 경우가 대부분이고, TOR 같은 경우는 시시각각 IP 가 바뀝니다.

        또 대다수의 ISP 가 고정 IP 가 아닌 유동IP를 제공 합니다. (고정 IP 는 ISP 를 통해 웹사이트를 운영한다던가 하는 특수한 상황에서나 돈을 더 내고 부여받습니다.)

        이런 경우 전기만 한번 꺼져도 IP 가 변경됩니다. ㅎㅎㅎ

        그리고 Enteroa 님도 저번에 한번 언급하셨지만, .htaccess 파일이 복잡해질 수록 심각한 수준의 웹사이트 속도저하가 발생합니다. 그래서 가급적이면 .htaccess 파일은 쓰지말라고 합니다.

        http://httpd.apache.org/docs/2.4/howto/htaccess.html

        You should avoid using .htaccess files completely if you have access to httpd main server config file. Using .htaccess files slows down your Apache http server. Any directive that you can include in a .htaccess file is better set in a Directory block, as it will have the same effect with better performance.

        가능하면 .htaccess 파일은 아예 쓰지 말라고 명시되어 있습니다.

        그렇지않아도 느려터진 아파치 서버를 .htaceess 로 힘들게 하면 너무 가혹한 처사? ^^;;

        • WordCracker says:

          제가 사용 중인 인터넷이 유동 IP가 맞지만, IP가 거의 고정되어 있습니다. 예전에는 컴퓨터를 켤 때마다 바뀌었지만 이제는 공유기에서 강제로 IP를 바꾸기 전까지는 거의 유지되는 것 같습니다. 아마 한국에서 대부분의 인터넷 사용자가 저와 비슷하지 않나 생각됩니다.

          가능하면 Matthew님께서 올려주신 코드를 사용하여 구현하면 좋겠지만 그렇지 않은 경우 플러그인을 사용해야 하는데요. 이 경우 플러그인을 설치하는 것과 .htaccess에 위의 코드를 넣는 것 중에 어느 것이 더 유리한지를 고려해보면 좋을 듯 합니다.

      • korbuddy.com says:

        넵 회원가입 막아놨어요 ㅎㅎ IP주소를 지정해 놓으면, 제가 등록한 IP주소를 사용하는 곳에서만 로그인이 가능하겠군요!

        다른 블로그에 한번 적용해 봐야겠습니다! ㅋ 워드크래커님과 메튜님은 항상 저에게 유용한 지식을 선물해 주시는 것 같아 감사할 따름입니다 ㅠ

Leave a Reply

Your email address will not be published. Required fields are marked *