BASIC認証とIP制限の組み合わせに何思う

この記事はだいぶ前に書かれたものなので情報が古いかもしれません
思えば、何で今までこれをやらなかったのか……そんなことを思った今日この頃、みなさまはいかがお過ごしでしょうか?


ウェブサイトの開発を行う際、テスト環境を用意している場合は一般のユーザーが閲覧できないようにBASIC認証で制限を掛けたりすることがあります。僕が今開発しているウェブサービスもそうです。

そのサイトなんですが、クレジット決済の機能がついてるんですよ。

今まではPayPalしか導入してなかったんですが、別のところも導入しようという話になりまして、現在その開発を行っているわけなんですよ。

この、楽天あんしん支払いサービスってやつ。楽天会員じゃないと使えないってんで、個人的にはどうなのかと思わなくもないんですが、まあ世の中に楽天会員って結構いるかもしれないもんね。その中でウチのサービス使ってくれてる人がどれだけいるかって話になると、実際に食パンを加えて登校する女子高生がどれだけいるのか議論するようなもんなんですが、まあそれはいいです。

このサービス、導入自体はわりと簡単で、サポートセンターみたいなところから導入用の資料をPDFでもらえるんですが、それ見ながらやるとクレジット決済機能を導入したことがない俺が開発してもわりとあっさりできる。良い仕事してますね、楽天さん。

ただ、導入はそんな感じで比較的スムーズにいけたんですが、疎通テストが上手くいかなかったんですよ。

決済をするところまではいけるんですけど、その決済結果の通知って言うんですか? その機能が上手く動かなくて、何度やってもAPIエラーってのが返って来る。

最初は何のこっちゃと思っていたんですが、考えてみたらBASIC認証が掛かってるせいなんじゃね? と思いまして、試しにBASIC認証を外してテストしたらエラーが返って来なくなりました。よっしゃ。

しかしまあ、いつまでもテスト環境のBASIC認証を外したままってわけにもいかないんで、どうしようかな〜と思ってたんですよ。疎通テストを行うときだけ一時的に外すのを毎回やるのも面倒だし。

で、考えてみたんですが、ウェブサイトってIPアドレスで閲覧制限掛けられるんだから、同じ要領でBASIC認証もIPアドレスで制限できるんじゃね? って思って調べてみたら、やっぱりできるんですね。



BASIC認証をかける

一応、IP制限の話をする前に、BASIC認証のかけ方を簡単に……。

一般的にBASIC認証をかけたかったら、.htaccessに必要な記述をすると思うんです。なので、今回もそういう流れでいきましょう。

まずは.htaccessというファイルを用意します。何か適当なテキストエディタを開いて、新規にファイルを作ればオーケーさね。

BASIC認証をかけるために必要な記述は、以下の通り。

AuthUserFile /www/test/.htpasswd
AuthGroupFile /dev/null
AuthName "Protected Area"
AuthType Basic
require valid-user

AuthUserFileっていうのは、BASIC認証をパスするために必要なIDやPWを記述したファイルのパスです。基本、絶対パスで書くのかな。ここでは仮に、wwwというディレクトリの下にtestというテスト環境用のディレクトリを作って、そこにIDとPWを記述した.htpasswdというファイルを置くと仮定した場合のパスを書いてます。自分の環境に合わせてここは任意に変わる。

.htpasswdの中にはIDと暗号化したPWなどを書けば良いんですが、まあ特別難しいことはないんで、ここでは省略。

こちらのサイトさんに、IDと暗号化したPWを生成してくれるプログラムが用意されているので、それを使うと良いんじゃないかな? かな?

すごいざっくりした説明でごめんね。困ったら「BASIC認証 htaccess」とかで検索すれば、こんな記事よりも数百倍分かりやすい参考文献がきっと見つかります。



IPアドレスによる制限

というわけで、今日の本題であるIPアドレスの制限をば。

まずは、さっきの.htaccessの中に、こんな一行を加える。

Satisfy any

これは簡単に言えば「指定したIPアドレスからアクセスするかBASIC認証で正しいIDとPWを入力した人にのみ閲覧を許可します」みたいな意味を持つ記述です。anyの代わりにallを記述することもできるみたいですが、それは指定したIPアドレスからのアクセスでなおかつBASIC認証をクリアした人じゃないと閲覧できない設定らしい。

今回は特定のIPのときはBASIC認証を外すようにしたいのだから、anyでOK。

次は許可するIPアドレスを記述する。とりあえずこんな↓感じ。

order deny,allow
deny from all
allow from 255.255.255.255

IPアドレスは適当です。

まずはorderで、許可と不許可のどっちから判定するかを指定する。上記の場合はdenyから、つまりアクセスを許可しない対象から先に判定することになります。仮に「order allow,deny」と書くと、許可する対象から先に判定する。

「deny from all」は、allが示すように、全てのアクセスを許可しないという意味です。例えば特定のIPアドレスからのアクセスだけ禁止したいなら「deny from 255.255.255.255」とか書けば良い。

「allow from 255.255.255.255」は反対に左記のIPアドレスからのアクセスのみ許可するという意味。ここに自宅のIPアドレスを書けば、自宅のPCからアクセスした場合のみBASIC認証が外れた状態になります。今回の僕の場合は、ここに楽天側のIPアドレスを書けば良いわけですね。

ここで「order allow,deny」ってなってると、先にallow fromで指定したIPアドレスを許可して、次に全アクセスを禁止してしまうので、結局どこからアクセスしてもBASIC認証に引っ掛かるようになる。つまりあまり意味ないってことですね。



とまあ、こんな感じで無事に疎通テストも完了しました。

前に、クレジットじゃないですけど似たような状況があって、BASIC認証を外さないとテストできないってんで、そのときだけ一時的にBASIC認証外してテストしてたんですけど、あのときもこれをやれば良かったんですね……。

僕は基本、PHPのコーディング以外の部分って分かってないことだらけですからね。サーバーの設定とかも全然できないし。

きっと、まだまだこういう、ちょっと調べれば実現できるようなことって、いっぱいあるんでしょうね。
 もしかしたら何か関連しているかも? 
 質問や感想などお気軽にコメントしてください