爬蟲與資源消耗
最近服務器總是告警,大半夜的一連串短信通知。
開始還嘟囔著便宜沒好貨,1核1G 的機器湊合著過吧。
忍了又忍,每次重啟完,過不了幾天就死了。只好抽時間看一下。
拿到 access.log ,初步分析是 404 的頁面和 search 結果頁被吃盡了資源。
一個是被爬蟲爬了無數次。
菲彩国际
一個是被惡意廣告搜了無數次。
爬蟲的好處理:
- 先調整了 robots.txt,讓聽話的爬蟲別爬我廢棄的目錄:
User-agent: *
Disallow: /xxxx/xxxx/ - 不聽話的沒辦法,限制了幾個 IP ,手動的:
order allow,deny
deny from 46.229.168.65
deny from 46.229.168. 121.224.143. (限制 IP 段,空格分開)
allow from all - 然而懶得總是查 IP ,得,直接屏蔽掉 xxxx 整個目錄:
order allow,deny
deny from all - 目錄外的文件 301 指向首頁,誰都別訪問了:
<?php
header("HTTP/1.1 301 Moved Permanently");
header("Location:http://cnzhongka.com");
?>
惡意搜索廣告:
這個麻煩點,我也不能屏蔽掉搜索功能,畢竟自己還要用。
- 還是先告訴懂事的爬蟲,別爬這些鏈接:
Disallow: /search/*
Disallow: /?s=
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 '<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 杏彩,一行一個,禁止搜索這些詞。 -
再然后,讀 log 發現,這些惡意搜索都是無 referer 的直接流量,那我可以改 search.php 的頭一行,加個域的判斷就好了:
<?php
$host = $_SERVER['HTTP_REFERER'];
if (substr($host, 0, 16) != 'http://cnzhongka.com/') {
header("location:http://cnzhongka.com/a/go-away.html");
exit;
} //是自己人再去讀數據庫,加載 header,不是自己人的請走開。
get_header();
?> -
有來源的這么搞:
RewriteEngine on
RewriteCond %{HTTP_REFERER} laobiao\.php [NC,OR]
RewriteCond %{HTTP_REFERER} xxxx\.org
RewriteRule .* - [F]
- 訪問指定文件名的:
<Files ~ ".asp$">
Order allow,deny
Deny from all
</Files> - 最后逼不得已,可以把 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"
Order allow,deny
Deny from all
</FilesMatch>
<FilesMatch "(wuwu11|xw|xw1|9678|db.init).php">
Order allow,deny
Deny from all
</FilesMatch>
折騰了好幾通,繼續觀察 ing
注意,折騰的時候找個測試目錄玩,自己把自己搞掛了無數次,一個空格沒轉義就整站 500 了。