ワードプレスの最初の設定では「存在しなければindex.phpが処理を行う」になっています。
index.phpを始点として実質ワードプレスのページとしてなんらかの処理を試みます。
ルートディレクトリの.htaccess 内当該箇所は以下になります。
RewriteCond %{REQUEST_FILENAME} !-f ファイルが存在しなければ
RewriteCond %{REQUEST_FILENAME} !-d フォルダが存在しなければ
RewriteRule . /index.php [L] index.phpが処理します
特定のフォルダの内容全部を非表示にする場合は、対象のフォルダに .htaccess を用意して
deny from all
にて外部からアクセスできなくなります。
内部からは、Webサービスを実行しているローカルユーザーからのアクセスになるので問題はありません。
内部からの読み出しでもWebサービス(httpアクセス)を経由して読み出そうとすると読み出せません。
指定のディレクトリ内の特定のファイルだけをアクセス拒否にするには、拡張子によって読み出せないと指定することができます。
以下拡張子(最後のドット以降部分)がいくつかの候補である場合、アクセス不可になる記述です。
<Files ~ "\.(htaccess|htpass|txt|doc)$">
deny from all
</Files>
ご参考くださいませ。
追記:
非表示というか正確には「アクセス不可」でした。
-
この返信は7年、 7ヶ月前に
msioが編集しました。理由: 表現がまちがっておりました。
こんにちは
Q1.
サーバーによっては不可能かもしれませんが、そのようなファイルはWebからアクセスできないディレクトリに入れておくのが良いと思います。
例に挙げられているパスwww/wp/wp-content/themes/test
ですと、www
の上です。
例えば、
/home/hogehoge.com/www/wp/wp-content/themes/test
というフルパスになっているのであれば、
hogehoge.com
ディレクトリなどに保存すればブラウザからアクセスすることは不可能です。
一方、functions.phpからは、フルパスで指定すれば該当ファイルを開くことができます。
Q2.
デフォルトでは全て見ることができるようになっています。
munyaguさん、msioさん、ご回答ありがとうございます。
デフォルトでは、ファイルがすべて見られるように設定されているとのことですが、
もう少し教えていただけますでしょうか。
Q1.デフォルトでphpのプログラムファイルの中身も外部ユーザーから見えてしまうのでしょうか。
私の環境では、phpファイルは、プログラムが実行されますが画面にその中身(コード)は表示されません。何か別の方法により、外部ユーザーからphpファイルの中身を見ることができてしまうのでしょうか。
Q2.もし、デフォルト設定で外部ユーザーは、phpファイルの中身は見ることができないのであれば、テーマディレクトリの下にあるfunctions.phpの中でdata.txtという名称のファイルをアクセスしていることを外部ユーザーは知ることはできないと思うのですが、正しいでしょうか。 あるいは、デフォルト設定で外部ユーザーから各ディレクトリーの下のファイル名がすべて取得できているのでしょうか。
Q3.もし、Q2で外部ユーザーは、デフォルト設定で各ディレクトリのファイル名を知ることができなければ、外部ユーザーは、data.txtというファイル名を特定できないので、実際には、その中身をみることはできない、と考えてよいでしょうか。 もし、そうであれば、とりあえず、アクセスするデータファイル名をもっと複雑な名称に変更して当面の対応としていと考えています。
どうぞよろしくお願いいたします。
実体のあるファイルはアクセスされますので通常の動作であればPHPファイルのソースコードは見えないはずです。
なのでどのファイルにアクセスしているかはわかりません。
ファイル名を把握できなければアクセスされる率はさがりますが、ディレクトリを一覧表示するなどの設定が生きていれば見れることもありますし、サイトマップ作成で掲載されてしまうこともあるかもしれません。
.htacess に禁則事項を書き込むだけでもアクセスはできなくなります。
@munyagu さんのご提案であればWeb動作にかかわらず何らかのエラーやウイルス、誤動作などからも守られます。
うっかりや問題発生時にどこまで守れるかの深度と設定の手軽さが比例していると思います。
Q1. プログラムの中身は(正しく実行されれば)見えません。
サーバーの設定誤りなどにより、実行されなかった場合にはソースコードが見えてしまいます。
しかし、実行されない状態ですとWordPress自体が動きませんので、すぐに分かります。
Q2. 正しいです。
ディレクトリ内のファイル全てを知られてしまうかどうかはサーバーの設定にもよりますが、そのディレクトリにブラウザからアクセスしてファイル一覧のようなものが見えなければ知られてしまうことはありません。
参考:http://www.atmarkit.co.jp/flinux/rensai/linuxtips/705noindexes.html
Q3.世の中には恐ろしく(悪)知恵の働く方がおられて、どこからも参照されていないはずのファイルをGoogleにキャッシュさせる人がいます。
実際にどのようにしているのか私は知りませんが、ディレクトリ内のバックアップファイルやIDとパスワードが入ったファイルなどを見つけ出してしまう人がいます。
ファイルの場所を変えたり、.htaccessで制限したりする手間はそれほど大変ではないと思います。
本当に見られたくないものであれば、枕を高くして寝るために隠すべきと思います。
munyaguさん、msioさん、ご丁寧な回答をありがとうございます。
とても勉強になりました。 アドバイスしていただいた方向で設定を変更したいと思います。
本当にありがとうございました。
munyaguさん、お世話になります。 もう少し教えていただけますか。
misioさんに教えていただいたように.htaccessファイルを下記のように設定したところ、表示させたくないtxtとdat拡張子のファイルの表示を不可にすることができました。
<Files ~ “\.(txt|dat)$”>
deny from all
</Files>
この状態でWordPressで処理をさせたところ、functions.phpから読み書きをするtest.txtファイルが更新できていないことがわかりました。 .htaccessの設定を解除(ファイルを削除)すると正常に更新されます。
>一方、functions.phpからは、フルパスで指定すれば該当ファイルを開くことができます。
とのことですが、functions.phpからの呼び出しでは、test.txtへのフルパスを指定しています。
Q1. .htaccessを設定したときにtest.txtが更新されなかったのは、wwwの直下にtest.txtを置いていないからでしょうか? テーマディレクトリで.htaccessでアクセス不可にするのではだめということでしょうか。
なお、ファイルのディレクトリを変更するにはfunctions.phpを変更しなければならず、まだ、WWW直下にファイルを置いての実験はできておりません。
Q2. できれば、www直下でなく、データファイルを管理するディレクトリを新設しそこにファイルを置きたいと思っているのですが、その場合は、はやり.htaccessでの制御となるため、functions.php経由でのファイル更新でできない、ということでしょうか。
どうぞよろしくお願いいたします。
.htaccess はその文字が示すようにHTTPアクセス、ゲートウェイを出たあとのWebサービスに対することを記述しているもので、Webサービスが一番最初にディレクトリ内容を確認するものです。
Webページを開くと index.html が最初に読まれるのに似ています。ディレクトリごとに設定でき上の階層から継承されます。
なので今回はルートディレクトリ(Webページ階層の一番上)でなくても、当該ディレクトリに新たに .htaccess を二つ目として置いても機能します。
そして、その指定はゲートウェイを出た後に機能するWebの制約なので内部的には機能しません。
ここで、設置すると読み書きできず、消すと動く、ということは「Webサービスでゲートウェイから出た後のアクセスで読み書きをしているのではないか」と思われます。
その原因は「フルパス」という表現ではないかと推測しているのですが、「フルパス」とは「Webサービスを実行しているユーザーの最上位階層」からの経路のことで、例として構文をあげると
「/var/home/user/webservice/www/指定のディレクトリ」のような形です。
もしかして「http://www.おつかいのWebアドレス/」のような指定でファイルにアクセスされていませんでしょうか。
ファイルの指定、もしくはファイルに書きこむプログラムが「HTTP」で始まるものではないでしょうか。
最終的にはサーバー内で読み書きをするので現在のパーミッション的には問題ないかと思います。
HTTPから始まるアドレスは「URL:統一資源位置指定子」と呼ばれていわゆる「通称」です。
「フルパス」というのは「絶対パス」とも呼ばれていて、実行しているユーザーの最上位階層からの経路です。
その中間にあるのが「相対パス」と言われていて「実行しているプログラムからの経路」になります。「../」を使って上に上がったり階層を降りたり、です。
相対と絶対は内部で機能するのでどちらでもよいかと思いますが、顕現させる効果によっては絶対でなくてはならないことがあります。
相対は実行したプログラムのWeb機能により与えられた権限からで機能しますが、Webサービスを含むアプリケーションレベル自体の権限を借りて機能させるには絶対パスが必応です。
完了してしまってからの後に稚拙な説明で申し訳ないのですがなにかの参考にいただければ幸いです。
ちなみに、書き込みについては別プログラムで行っていてトリガを function.php 内に設置している場合はWebアクセスでの稼働になり制約を受け、フルパスで書き込みプログラムを書けばWebの制約を受けないのでWebプログラム自体が稼働しないということになります。
misoさん、お世話になります。
>もしかして「http://www.おつかいのWebアドレス/」のような指定でファイルにアクセス
>されていませんでしょうか。
functions.phpの中のコードを確認したところ、読み書きするファイルのパス指定は、
__DIR__ を用いています。 __DIR__.”/test.txt”
また、functions.php内のファイルのアクセスは、fopen, fputs, fclose コマンドで行っております。
__DIR__.”/test.txt” のファイル名指定は、絶対パスで指定されている、との理解でよいのでしょうか。
どうぞよろしくお願いいたします。
絶対パスで指定されているで大丈夫だと思います。
それで更新がされないとなると、ファイルのアクセス権が変、またはファイルの位置が異なるしか思い浮かびませんでした。
その構文のままで .htaccess の記載を変更すると更新がなされるのですよね。
読み書きの構文にも問題ないと思います。
念のため、アクセス不可にした状態で指定位置にファイルがあることをプログラムが確認できるかどうか file_exists にて一旦ファイルの存在を確認いただけますでしょうか。
そのうえで、もしかするとパーミッションの書き込み指定に問題があるかもしれないと思いますので、いまいちどファイルのアクセス権が何番になっているかご確認いただけますでしょうか。
所有者または管理者が有効になっていれば書き込めると思いますがまれにユーザーレベルの違うところで動作がなされている場合もあるのでご確認いただけると幸いです。
misioさん、貴重なアドバイスありがとうございます。
確認してみます。 結果をご報告するのにちょっと時間を要してしまうかも知れません。
今後ともよろしくお願いいたします。
misioさん、munyaguさん、お世話になります。
.htacessを再度設定してテストしたところ、.txtを表示禁止にすることができました。
前回は、恐らくタイプミスか何かの単純が私のミスだったのではないかと思います。
大変お手数をお掛けして申し訳ありませんでした。本当に助かりました。
ありがとうございました。 今後ともよろしくお願いいたします。