爬虫与资源消耗

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

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

爬虫的好处理:
  1. 先调整了 robots.txt,让听话的爬虫别爬我废弃的目录:

    User-agent: *
    Disallow: /xxxx/xxxx/

  2. 不听话的没办法,限制了几个 IP ,手动的:

    order allow,deny
    deny from 46.229.168.65
    deny from 46.229.168. 121.224.143. (限制 IP 段,空格分开)
    allow from all

  3. 然而懒得总是查 IP ,得,直接屏蔽掉 xxxx 整个目录:

    order allow,deny
    deny from all

  4. 目录外的文件 301 指向首页,谁都别访问了:
    <?php
    header("HTTP/1.1 301 Moved Permanently");
    header("Location:http://uicss.cn");
    ?>
恶意搜索广告:

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

  1. 还是先告诉懂事的爬虫,别爬这些链接:

    Disallow: /search/*
    Disallow: /?s=
    Disallow: /index.php?s=

  2. 然后在模板的 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 '<textarea name="uicss_search_key" rows="10" cols="50" id="uicss_search_key" class="large-text code">' . get_option('uicss_search_key') . '</textarea>';
    }
    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 杏彩,一行一个,禁止搜索这些词。

  3. 再然后,读 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();
    ?>
  4. 有来源的这么搞:

    RewriteEngine on
    RewriteCond %{HTTP_REFERER} laobiao\.php [NC,OR]
    RewriteCond %{HTTP_REFERER} xxxx\.org
    RewriteRule .* - [F]

  5. 访问指定文件名的:
    <Files ~ ".asp$">
         Order allow,deny
         Deny from all
    </Files>
  6. <FilesMatch ".(asp|htaccess|jsp|rar|zip)$">
     Order allow,deny
     Deny from all
    </FilesMatch>

    <FilesMatch "(wuwu11|xw|xw1|9678|db.init).php">
     Order allow,deny
     Deny from all
    </FilesMatch>
  7. 最后逼不得已,可以把 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"

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

崔凯博客
Powered by WordPress | Theme by ck web design | TOP 顶部
Copyright © 崔凯 All rights reserved. 蜀ICP备12025891号.