アクセスするIPのTOPをはじくことを思いつきました。
こんなサイトにしつこく見に来る人ランキングのための1行コマンド野郎は・・・
# cut -c-15 access.log* | sort | uniq -c | sort
1.cut -c-15 access.log* アクセスログの先頭にはIPアドレスが書いてあったので行の先頭15文字を切り取る。最後の*はローテーション済みも含めるため
2.sort 1の結果のIPアドレスを順にソートする。※ソートしないとuniqコマンドがうまく処理できないから
3.uniq -c 2の結果からユニークなIPアドレスを抽出し、ついでにカウントもしてもらう
4.sort 3.の結果をuniqが付けたカウント数、IPアドレスの順にソート。
これで、見つかるはず。
何か、とても実用性の高かそうなものに思えてきた。
※記憶には無いけどドコかに元ネタがあります。
では第一位は・・・
8700 192.168.xxx.xxx
そっかぁ~気のせいだったのか・・・(オイ
そして第二位は、お世話になっているグーグル先生。どうやらIPをいくつも使ってる様で実質一位?
ログインページで403を返すようにして10日経過しているが、
しつこいBOTは本当にしつこい。
TOP画面からログイン・リンクを消してお茶を濁すとしましょうか・・・(大笑
これでも延々とログイン画面を見に来るコトロは
かなり怪しいハズ。
もう忘れてほしいなぁ。
URLを変えようとHide Loginプラグインを入れたら
.htaccessで無限ループ。
バックアップがあったから修復できたけど・・・要注意ですね。
意味はあまりないが、配下のファイルの拡張子だけ切り取ってくる1行スクリプトも考えてみた。
# find . -print | sed ‘s/\([^\.]\+\)\.//g’ | sort | uniq -c
単純に「(何たら).」のパターンは消すを繰り返すことで、最後「.」と【後ろ】が残る力技です。
デバッグ用の残骸ファイルを発見するのには便利ですが、リリース後に走らせるモノとしては最悪ですね。
.bakとか残ってませんよね?
ディレクトリも反応してしまうので find にファイルだけ出力するオプションも必要ですね。
# find . -type f -and -print | sed ‘s/\([^\.]\+\)\.//g’ | sort | uniq -c
これで、tarとかbmp とか出てきたら要チェックですね。
さぁやってみましょうか・・・
6 .bmp えええ?ドコ???
2 ..png ううむ。元は何だろう??????
あ、本当に ..pngだった! (玉の様な汗が・・・
メディアから..を.にすると使用記事のリンクに反映されるも
画面クリック時のリンクと肝心のファイル名が..のままなので、手作業。
画面記事は治ったもののメディアページは..のままDBに格納している情報があるらしい。
直観で発見。
ソースを読んで
SELECT * FROM `wp_posts` WHERE post_type = ‘attachment’ AND post_name = ファイル名(拡張子なし)
で情報をると実際に使用するURLは guid にあることが判るので書き換え。
しかし、まだ参照先があるらしくメディアの編集画面にプレビューが出ない。
直観で、
SELECT *
FROM `wp_postmeta`
WHERE meta_value LIKE ‘%{ファイル名}%’
でヒットしたのでpost_titleやguidを書き換えた。
そんな訳で、変なファイル名を手直しするくらいなら、アップし直した方が絶対楽です。(笑
タマには画像を全部DLしてAVASTなんかで虫干しするのもいいかな。
ここまでやって何だけど・・・
.htaccess のrewriteに
RewriteCond %{REMOTE_ADDR} !^192.168.***
RewriteRule (.*)login(.*) 404.php
を追記してみた。
loginを含むurlは全てテーマの404に移動してしまうので、エラーコード404も返すのでBOTも諦めないかな?
***.***.***.*** – – [29/Apr/2013:04:53:34 +0900] “POST ************ 302 – *********************
ダメか、
否、しばらくすると無限ループに
設定がダメなのか?
仕方がないのでログインのPHPでIPアドレスで、404ページをincludeしてみた。
require( dirname(__FILE__) . ‘/wp-load.php’ );
の下に
# クライアントのIPアドレスを調べる。 $ipAddress = $_SERVER["REMOTE_ADDR"]; # .で分解してみる
$ipAdr = preg_split("/\./",$ipAddress); #クライアントのIPアドレスのセグメント つまり WANのソレになるはずなんだが・・・、先頭から3つの数字が 当方のLocalAdressと一致しない場合はテーマの404.phpを表示する
if ( $ipAdr[0] != XXX || $ipAdr[1] != YYY || $ipAdr[2] != ZZZ ) { ← XXX YYY ZZZはLANのセグメントのXXX.YYY.ZZZ.WWWな感じ
include(TEMPLATEPATH . '/404.php');
exit();
}
と書き込んでみた。
これなら200が返るのでBOTも安心して休んでくれるだろう。
今のところは5個のBOTの気をそらすことに成功した。
しかし今度はHTTPヘッダーを偽装してPOSTしてくるかもしれないが、ルータで弾いてくれそうな気がする。
これでダメなら、iptablesで全ページのリクエストを突っ返すだけだ。
一番良いのは、WordPress自体が本物のログインページのURLは127.0.0.1のみアクセスでき、外部アクセス用のURLは好きなものを選べれば一番なんだけどね。
外部アクセス用のURLも、IP制限付とか2段階認証とかできればいいんだけどね。
やってはくれないんだろうなぁ~
残るは、スパム・コメントをUSのど真ん中から連打してくるイカレタBOTをどう料理するか?
常時ではないが、不意に同じ記事にコメントを延々と連発してくるので、イカレ度は結構高い。
自宅鯖にとってはインシデント・クラスだ。
対応策としては、1分内に3回コメントを撃ってきたら一か月くらい弾く(コメント欄にTEXT-BOXの替わりに画像を載せる等)のが一番効果がありそうだ。人間ならそんなに急いでコメントする訳が無いからね。
それでもPOSTしてきたら・・・相手のプロバイダーに故障してる様だと教えた方が親切かもしれない。