ログインページへの不正アクセスを防ぐ 〜ドメイン単位での制御編〜

この記事はだいぶ前に書かれたものなので情報が古いかもしれません
不正アクセス、ダメ、絶対

この記事を三行にまとめると

い〜つの〜こと〜だか〜♪ 思い出してご〜らん〜♪
ドメイン名での制御をやってみようと思います
暇人はほんとどこにでもアクセスしてくんだなぁ……
い〜つの〜こと〜だか〜♪ 思い出してご〜らん〜♪

まあ、思い出さなきゃいけないほど昔のことでもないんですが、ちょい前に、Wordpressに大量のアクセスが来てちょっと困ったことがありました。

WordPressのhtaccessを編集するときにちょっち注意したい+α

この記事で書いたときのやつですね。

あのときは、Wordpressの中にあるxmlrpc.phpってところに大量のアクセスが来てあーだこーだって感じでしたので、xmlrpc.phpへの不正アクセスを防ぐことで何とかなったんですが、それで一安心していたら、今度は管理画面のログインページに大量のアクセスが来るようになりました。たぶん不正にログインしようとしてるんだと思う。

パスワードを強固なものにしとけば気にしなくても大丈夫かもしれませんが、不正にログインはできなくても、大量にアクセスが来続けるのが嫌ってこともあるでしょう。そんな場合のために、今回はWordpressのログインページであるwp-login.phpへのアクセスを限定しちゃおうと思います。

やり方はいくつかあると思いますが、今回はドメイン名での制御をやってみます。

説明は後に回すとして、とりあえず書いてみましょう。

<IfModule mod_rewrite.c>
RewriteCond %{REQUEST_METHOD} POST
RewriteCond %{HTTP_REFERER} !^http://(.*)?(norm-nois\.com) [NC]
RewriteCond %{REQUEST_URI} ^(.*)?wp-login\.php(.*)$ [OR]
RewriteCond %{REQUEST_URI} ^(.*)?wp-admin$
RewriteRule .* / [R=404,L]
</IfModule>

これは、あかつきのお宿でやった場合の例ですね。

やっていることは、POSTデータが管理画面のログインページに飛んで来た時、リファラを見て、自分のドメインじゃなかったら404エラーにしている感じです。こうしておけば、少なくとも別ドメインのページから飛んで来るPOSTデータは防ぐことができますね。

正当に管理画面のログインページからIDとパスワードをPOSTする場合は、リファラに自分とこのURLが入ってくるはずなので、基本的には問題ないはず。

ただしこれだと、一つのドメインからしかアクセスを許可しないようになってしまうので、もし複数のドメインからのアクセスを許可したい場合は……どうすれば良いかな。手っ取り早いのは、正規表現のORを使うとかですかね?

RewriteCond %{HTTP_REFERER} !^http://(.*)?(norm-nois\.com|hogehoge\.jp) [NC]

例えばこんな風に書けば、「norm-nois.com」と「hogehoge.jp」からのアクセスが許可されますね。



僕の勝手な印象では、Wordpressで運用しているサイトって、たいていドメインは一つだし、いろんなところから管理画面へのログインを許可するようなこともそんなにはないはずなので、たぶんこのやり方でやっちゃっても良いように思います。

もちろん、IPアドレスで許可するアクセスを指定するとか他のやり方もいろいろありますし、どれがベストかは僕にもよく分からないので、どう防ぐかは状況に応じてって感じですね。でも、もし上記のようなやり方で大丈夫そうなら、試して損はないと思います。

あと、今回はWordpressの管理画面での話でしたけど、別にWordpressでしか使えない方法ではないですね。.htaccessでガードしようっていう話なので、自分で作成した管理画面への不正なアクセスなども、同様な方法で防ぐことはできます。

それにしても、暇人はほんとどこにでもアクセスしてくんだなぁ……。
 もしかしたら何か関連しているかも? 
 質問や感想などお気軽にコメントしてください