FREEDOM. FRIENDS. FEATURES. FIRST.
페도라 한국 사용자 모임

아파치 rewrite룰에 대해 여쭤보겠습니다.

게시판 질문게시판 아파치 rewrite룰에 대해 여쭤보겠습니다.

  • This topic has 2개 답변, 2명 참여, and was last updated 5 years, 8 months 전에 by 난해주님. This post has been viewed 24 times
  • 만든이
    게시글
  • #13635
    난해주님
    참가자
    • 게시글114
    • 댓글337
    • 총합451
    • ★★
    @workman729
    오늘 제가 관리하는 쇼핑몰에서 한개의 동일한 아이피로 양일간 24만번의 페이지 뷰를 기록하였습니다.

    급한 김에 아이피로 차단하였지만 보다 효율적인 관리를 위해 .htaccess 파일을 이용하여 rewrite 룰을 설정할까 합니다.

    그래서 여쭤 보겠습니다만 룰이 500에러를 내는 것은 확인하였습니다만
    특정 파일로 경고 조치를 하려고 하는 데 모든 user-agent에서 출력되는 것을 보니
    뭔가 설정을  잘못 한 것 같습니다.

    이를테면 아래를 참고 하시기 바랍니다.

    RewriteEngine On
    RewriteBase /
    RewriteCond %{HTTP_USER_AGENT} ^.*\.mail\.ru [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^.*fc5* [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^aiHitBot [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^Aboundex/0.3 [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^AntBot/1.0 [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^AISearchBot [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^AMZNKAssocBot/4.0 [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^archive\.org_bot [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^Baiduspider [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^Baiduspider+ [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^coccoc/1.0 [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^CoPubbot/v1.2 [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^checks\.panopta [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^DBLBot [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^Daumoa/3.0.6 [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^Daumoa/3.0 [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^Drupal [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^Dillo/0.8 [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^Ezooms/1.0 [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^EasouSpider [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^emefgebot/beta [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^elefent/Elefent/1.2 [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^FlightDeckReportsBot/2.0 [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^fulltextrobot [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^Gigabot/3.0 [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^Googlebot-Image/1.0 [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^heritrix [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^info.wbcrwl.305.09 [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^ia_archiver [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^KamodiaBot [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^kimsufi [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^KomodiaBot/1.0 [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^linkoatlbot/Linkoatl-0.9 [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^MeanpathBot [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^MRSPUTNIK [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^news\ bot\ /2.1 [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^NetSeer [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^NetcraftSurveyAgent/1.0 [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^oBot/2.3.1 [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^psbot/0.1 [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^Python-urllib [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^1.2.3\ CPython/2.7.3 [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^Powermarks/3.5 [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^Plukkie/1.5 [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^Presto/2.7.62 [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^Sogou [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^SISTRIXCrawler [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^SeznamBot/3.0 [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^ssearch_bot [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^Sleuth/1.3.8 [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^VoilaBot [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^Yeti/1.0 [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^YandexBot [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^YandexDirect/3.0 [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^YandexImages/3.0 [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^YandexBot/3.0 [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^YandexFavicons/1.0 [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^YisouSpider [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^woriobot [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^Wotbox/2.01 [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^Wotbox [NC]
    RewriteCond %{HTTP_USER_AGENT} ^ZumBot/1.0 [NC]
    RewriteRule . - [F,L]

    위의 로봇에 대한 설정은 500에러가 정확히 납니다.
    다만 RewriteRule을 특정 경고 페이지로 이동하게 설정하면
    모든 사용자에게 경고 페이지가 노출 됩니다.

    공통적으로 모든 사용자에게 노출되는 설정은 다음과 같습니다.

    RewriteRule ^$ /warning.html [L]
    RewriteRule ^(.*)$ /warning.html

    위의 해당 로봇에게만 경고 페이지를 노출 시키려면 RewriteRule을 어떤식으로 설정 해야 할까요?

    그리고 한가지 더 여쭤 보겠습니다만 한개의 동일한 아이피로 접속한 user-agent가 다른 것은 어떻게 해석해야 할까요?
    Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727) Havij
    Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)

    양일간의 공격으로 보아 뭔가 agent를 바꿔서 공격한 것 같은 데
    그래서 rewrite룰이 먹히지 않은 것일까요?

    첫번째 설정은 RewriteCond %{HTTP_USER_AGENT} ^Havij [NC,OR]
    두번째 설정은 RewriteCond %{HTTP_USER_AGENT} ^.*(winhttp|HTTrack|clshttp|archiver|loader|email|harvest|extract|grab|miner|havij|wapiti).* [NC,OR]
    세번째 설정은 RewriteCond %{HTTP_USER_AGENT} (havij|libwww-perl|wget|python|nikto|curl|scan|java|winhttp|clshttp|loader) [NC,OR]

    위의 설정이 모두 차단시키지 못하는 것으로 보입니다.

    하여튼 이리 저리 하고는 있는 데 참 걱정입니다.
    고수님들의 지도 편달 부탁드립니다.
1 답변 글타래를 보이고 있습니다
  • 글쓴이
    답변
    • #15445
      태랑
      키 마스터
      • 게시글209
      • 댓글880
      • 총합1089
      • ★★
      @admin

      먼가 애기를 해드리고 싶으나.... 제가 아는 한도를 이미 훌쩍 넘어서
      머라고 답을 하나도 못드리겟네요 ㅠ_ㅠ,

      잘되시면 공유좀....

      오픈소스를 응원합니다 Blog https://hoing.io
      Senior Database Administrator(Mysql, Oracle)

      사이트 이용 문의 사항은 댓글이나 admin@fedoralinux.or.kr 로 메일주세요

    • #15446
      난해주님
      참가자
      참가자
      • 게시글114
      • 댓글337
      • 총합451
      • ★★
      @workman729

      오늘따라 아이버스 말썽입니다. 아...! 우분투는 좀 지저분합니다.

      태랑님의 말씀은 너무 겸손한 말씀이십니다. 진짜 고수님은 태랑님이 분명합니다.
      어째든 아파치 mod_rewrite 모듈은 유용하게 사용되긴 하자만 자주 사용하는 편이 아니라서
      저도 룰 셋팅에 어려움을 겪고 있는 것 같습니다.

      위의 예제는 효과 100%로 검색 사이트의 로봇을 차단할 목적으로 접속시 500에러 또는 403에러를 보여 줍니다.
      다만 클라이언트가 법적 다툼을 목적으로 위의 user-agent가 접속하면
      아이피와 날짜 뭐 그런 정도를 저장할 목적으로 흔히 브라우저서 보여주는 에러가 아닌
      특정 페이지로 이동하길 원해서 php로 페이지를 만들었습니다.

      조금 혼돈스러운 것은 마지막 rewriteRule이 액션을 결정하는 데
      아래 처럼 하면  안된다기 보다는 제가 에러 페이지를 보게되는 것은 모든 유저가 보게 되므로
      뭔가 들어 맞지 않는 것이겠지요? (해당 로봇에게만 출력되어야 하므로)

      RewriteRule . - [F,L]//403에러 [F]는 500에러 잘됨
      RewriteRule ^(.*)$ 403.html //안됨
      RewriteRule ^(.*)$ /403.html [F,L]  //안됨

      다음엔 RewriteRule . /403.html [F,L]로 테스트 해봐야 하겠습니다.

      이 부분만 해결하면 만사가 편안해 집니다.

      간단히 로봇에 대한 예만 들어지만 아래는 sql injection 방어에 쓰이는 룰입니다.
      효과는 99% 확신합니다. mod_security 보다 효과적이라 생각합니다.

      RewriteCond %{QUERY_STRING} [a-zA-Z0-9_]=http:// [OR]
      RewriteCond %{QUERY_STRING} [a-zA-Z0-9_]=(\.\.//?)+ [OR]
      RewriteCond %{QUERY_STRING} [a-zA-Z0-9_]=/([a-z0-9_.]//?)+ [NC,OR]
      RewriteCond %{QUERY_STRING} \=PHP[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12} [NC,OR]
      RewriteCond %{QUERY_STRING} (\.\./|\.\.) [OR]
      RewriteCond %{QUERY_STRING} ftp\: [NC,OR]
      RewriteCond %{QUERY_STRING} http\: [NC,OR]
      RewriteCond %{QUERY_STRING} https\: [NC,OR]
      RewriteCond %{QUERY_STRING} \=\|w\| [NC,OR]
      RewriteCond %{QUERY_STRING} ^(.*)/self/(.*)$ [NC,OR]
      RewriteCond %{QUERY_STRING} ^(.*)cPath=http://(.*)$ [NC,OR]
      RewriteCond %{QUERY_STRING} (\<|%3C).*script.*(\>|%3E) [NC,OR]
      RewriteCond %{QUERY_STRING} (<|%3C)([^s]*s)+cript.*(>|%3E) [NC,OR]
      RewriteCond %{QUERY_STRING} (\<|%3C).*iframe.*(\>|%3E) [NC,OR]
      RewriteCond %{QUERY_STRING} (<|%3C)([^i]*i)+frame.*(>|%3E) [NC,OR]
      RewriteCond %{QUERY_STRING} base64_encode.*\(.*\) [NC,OR]
      RewriteCond %{QUERY_STRING} base64_(en|de)code[^(]*\([^)]*\) [NC,OR]
      RewriteCond %{QUERY_STRING} GLOBALS(=|\[|\%[0-9A-Z]{0,2}) [OR]
      RewriteCond %{QUERY_STRING} _REQUEST(=|\[|\%[0-9A-Z]{0,2}) [OR]
      RewriteCond %{QUERY_STRING} ^.*(\[|\]|\(|\)|<|>).* [NC,OR]
      RewriteCond %{QUERY_STRING} (NULL|OUTFILE|LOAD_FILE) [OR]
      RewriteCond %{QUERY_STRING} (\./|\../|\.../)+(motd|etc|bin) [NC,OR]
      RewriteCond %{QUERY_STRING} (localhost|loopback|127\.0\.0\.1) [NC,OR]
      RewriteCond %{QUERY_STRING} (<|>|'|%0A|%0D|%27|%3C|%3E|%00) [NC,OR]
      RewriteCond %{QUERY_STRING} concat[^\(]*\( [NC,OR]
      RewriteCond %{QUERY_STRING} union([^s]*s)+elect [NC,OR]
      RewriteCond %{QUERY_STRING} union([^a]*a)+ll([^s]*s)+elect [NC,OR]
      RewriteCond %{QUERY_STRING} (;|<|>|'|"|\)|%0A|%0D|%22|%27|%3C|%3E|%00).*(/\*|union|select|insert|drop|delete|update|cast|create|char|convert|alter|declare|order|script|set|md5|benchmark|encode) [NC,OR]
      RewriteCond %{QUERY_STRING} (sp_executesql) [NC]
      RewriteRule ^(.*)$ - [F,L]

1 답변 글타래를 보이고 있습니다
  • 답변은 로그인 후 가능합니다.