最近服务器总是告警,大半夜的一连串短信通知。
开始还嘟囔着便宜没好货,1核1G 的机器凑合着过吧。
忍了又忍,每次重启完,过不了几天就死了。只好抽时间看一下。
拿到 access.log ,初步分析是 404 的页面和 search 结果页被吃尽了资源。

一个是被爬虫爬了无数次。
一个是被恶意广告搜了无数次。

爬虫的好处理:
  1. 先调整了 robots.txt,让听话的爬虫别爬我废弃的目录: User-agent: *<br /> Disallow: /xxxx/xxxx/

    • 不听话的没办法,限制了几个 IP ,手动的: order allow,deny<br /> deny from 46.229.168.65<br /> deny from 46.229.168. 121.224.143. (限制 IP 段,空格分开)<br /> allow from all

      • 然而懒得总是查 IP ,得,直接屏蔽掉 xxxx 整个目录: order allow,deny<br /> deny from all

        • 目录外的文件 301 指向首页,谁都别访问了:

          <?php header(“HTTP/1.1 301 Moved Permanently”); header(“Location:http://uicss.cn"); ?>

恶意搜索广告:

这个麻烦点,我也不能屏蔽掉搜索功能,毕竟自己还要用。

  1. 还是先告诉懂事的爬虫,别爬这些链接: Disallow: /search/*<br /> Disallow: /?s=<br /> Disallow: /index.php?s=

    • 然后在模板的 function.php 里,加入个搜索的限制:
      add_action(‘admin_init’, ‘uicss_search_ban_key’);
      function uicss_search_ban_key() {
      add_settings_field(‘uicss_search_key’, ‘uicss搜索关键词屏蔽’, ‘uicss_search_key_callback_function’, ‘reading’);
      register_setting(‘reading’, ‘uicss_search_key’);
      }
      function uicss_search_key_callback_function() {
      echo ‘‘;
      }
      add_action(‘template_redirect’, ‘uicss_search_ban’);
      function uicss_search_ban() {
      if (is_search()) {
      global $wp_query;
      $uicss_search_key = get_option(‘uicss_search_key’);
      if ($uicss_search_key) {
      $uicss_search_key = str_replace(“\r\n”, “|”, $uicss_search_key);
      $BanKey = explode(‘|’, $uicss_search_key);
      $S_Key = $wp_query->query_vars;
      foreach ($BanKey as $Key) {
      if (stristr($S_Key[‘s’], $Key) != false) {
      wp_die(‘请不要搜索非法关键字’);
      }
      }
      }
      }
      }

      上传好之后,在后台可以配置一些关键词,例如:
      www com net 杏彩,一行一个,禁止搜索这些词。

      • 再然后,读 log 发现,这些恶意搜索都是无 referer 的直接流量,那我可以改 search.php 的头一行,加个域的判断就好了:

        <?php $host = $_SERVER[‘HTTP_REFERER’]; if (substr($host, 0, 16) != ‘http://uicss.cn/') { header(“location:http://uicss.cn/a/go-away.html"); exit; } //是自己人再去读数据库,加载 header,不是自己人的请走开。 get_header(); ?>

      • 有来源的这么搞:

        RewriteEngine on<br /> RewriteCond %{HTTP_REFERER} laobiao\.php [NC,OR]<br /> RewriteCond %{HTTP_REFERER} xxxx\.org<br /> RewriteRule .* - [F]<br />
        • 访问指定文件名的:
          Order allow,deny
          Deny from all


        • Order allow,deny
          Deny from all


          Order allow,deny
          Deny from all

          • 最后逼不得已,可以把 user agent 符合的全拒绝掉。(他们假装正常用户也是让人烦躁)
            配合着 user-agent Switcher 试了半天,原来各种符号全都需要转义,不仅是空格和点,连括号都要转,真是费劲:

            RewriteCond %{HTTP_USER_AGENT} "Mozilla/5\.0\ \(Macintosh\;\ Intel\ Mac\ OS\ X\ 10_12_4\)\ AppleWebKit/537\.36\ \(KHTML,\ like\ Gecko\)\ Chrome/57\.0\.2987\.133\ Safari/537\.36"<br />

折腾了好几通,继续观察 ing
注意,折腾的时候找个测试目录玩,自己把自己搞挂了无数次,一个空格没转义就整站 500 了。