「探さないでください」と言うファイルくんの願いを叶える

2012年10月30日

こないだ「PHPでの共通ファイルの呼び出し方をまとめました」で、設定ファイルをドキュメントルート配下に置く場合と置かない場合について書いたんですが、書いてる時に思ったことがあったのでついでに書いてみようかと思います。

僕がディレクターになりたての頃は、ちょくちょく案件の修正対応とかで僕も PHP を触らせてもらってました。元々エンジニア志望だったから楽しかった思い出がありますしそこでいろいろ勉強させてもらいました。

その時に先輩エンジニアの方々が「設定ファイルをドキュメントルート配下に置くってどうよ」みたいな話をしてたことがあったので、もしかしたら一般的には設定系のファイルは /htdocs/ よりも上の階層に置くものなのかもそれませんね。

ただ、ドキュメントルート配下に全部置いちゃいたいことって、ありますよね。だって面倒だしー。なので、そういう場合にはどうすればいいか、どうするべきか、というお話です。

何故 /htdocs/ 配下に置いてはダメなのか

何でそんな議論が始まるかというと、多分設定ファイルなんてものは閲覧者にアクセスしてもらうようなファイルじゃない。しかも場合によってはDBのパスワードとかが書かれてる場合もあります。

そんなファイルにユーザーがアクセスできるのは確かに怖いですよね。

そして、 /htfocs/ より上の階層におけば基本的にアクセスできないんだからわざわざ危険を冒して置く必要はないだろうと、そういう話ですね。

でもまぁ最初の話で、 /htfocs/ 配下じゃないとダメなこととかもあったりするでしょうしね。

見られたくないならそれなりの努力を

そもそもさ、作ってる側としては、少なくともこちらがアクセスしてほしいと思うファイル以外にはアクセスしてほしくない訳で、勝手にアクセスしてんじゃねーよ素直にリンク辿れよと思うわけですよね。

ただ、閲覧者はURLさえ叩けばアクセスする可能性はあるし、それに対して「何でアクセスすんだよ!」と言うのはお門違いであってアクセスできるようにしておく運営側に問題があると言わざるを得ない訳ですね。アクセスされて困るようなものをアクセスできるとこに置いてる方が悪い、と。

いやまぁそこまで強く言うつもりはないんですが、攻撃者とかは当然そう思ってますから気を付けてね、って話です。

.htaccess に見られないよう記述

じゃあ、見られたくないファイルには .htaccess ファイルに記述して見られないようにしてしまいましょうというのが今回の趣旨です。 .htaccess を配置する場所は設定ファイルを置いているフォルダの /htdocs/lib/ に、記述は以下の通りです。

< ;Files ~ "\.(php)$">;
deny from all
< ;/Files>;

簡単ですね。これで .htaccess を配置しているフォルダ配下のファイルに php ファイルには http でのアクセスができません。

一歩進めたやり方

ただ、このやり方だと、アクセスしてほしくないファイルが一つのフォルダ配下にまとまってないといけないですし、もしアクセスしても良い php ファイルがあった場合、そのファイルもアクセスできなくなってしまいます。ちょっと汎用的ではないですね。

なので、そういった時の対応策として、上記 .htaccess をドキュメントルートに配置する、という手があります。するとなんと!ドキュメントルート配下の全 php ファイルにアクセスができなくなります。おぉ、本末転倒。

さすがにそれは困ってしまうので、設定ファイルとアクセスしても良いファイルを区別しましょう。一般的に .inc を使うのが普通のようです。

//こんなファイル構成を
htdocs/
 ├lib/
 │└.htaccess
 │└set.php
 │└aaa.php
 └index.php
↓
// こうすると良いよ!!
htdocs/
 ├lib/
 │└set.inc
 │└aaa.inc
 └index.php
 └.htaccess

拡張子を変更したら、呼び出し元の記述変更もお忘れなく。

そして、 .htaccess ファイルの記述も変更します。

< ;Files ~ "\.(inc)$">;
deny from all
< ;/Files>;

いかがでしょ。

これでアクセスしてほしくないファイルにはアクセスできなくなりました。こういうのをよりセキュアになった、と表現するんですかね。

どう表現するかは分からないですが、とりあえず僕はこれでさらにひとつ賢くなりました。このまま少しずつ賢くなっていけば常時賢者モードが発動できるかな?と思ったけど賢者モード多分つまらんから欲にまみれてる方が良いなと思い直しました。

おまけ

今回の対応は、データベースとかを使わずに CSV ファイルとか dat ファイルでコンテンツの管理をしていたりする場合にも有効です。その場合には .htaccess の記述を以下のようにしましょうね。

< ;Files ~ "\.(inc|csv|dat)$">;
deny from all
< ;/Files>;

他にこんな事も書いてます

FBでコメント

2個のコメント

  1. 書いたよ:「探さないでください」と言うファイルくんの願いを叶える – http://t.co/iyTJcDsy

  2. @jyugobeger より:

    SS | 「探さないでください」と言うファイルくんの願いを叶える http://t.co/F172rLNx @anticyborgさんから

トラックバック/ピンバックはありません。