①アクセスユーザーは、どのようにしてそのファイルのありかが分かるのでしょうか?
ファイル名が十分長い乱数であれば、それをたまたま当てることは不可能なので、「どこかから漏れた」と考えるのが妥当かと思います。
いただいた情報からは漏洩原因は推測できませんが、ありえる可能性としては以下のようなものがあります。
- ディレクトリリスティングが有効になっていた(Options -Indexesで防げるはずだがなんらかの理由で無効になっていた等)
- PHPファイルに外部サイトへのリンクがあり、RefererからURLが漏洩する
- PHPファイルにアクセスしたPCがウイルス感染している
- 途中にPROXYサーバーがあり、PROXYサーバーの管理者が悪さをしている
- ウェブサーバーが外部から侵入されている
あまり愉快な理由はありませんが、ファイルの存在を隠したい場合、「ファイル名を十分長い乱数にする」というのは、あまり推奨されないものの、現実には使われている方法です。私の知っている例だと、ジャパンネット銀行の取引明細PDFはこの方法で保護されています。ネットバンキングでも採用例がある、という程度には安全であるわけです。
②ファイルを完全に隠すにはどのようにしたらよいでしょうか?
他の方も書いておられるように、しかるべき認証(BASIC認証など)を使うのが簡便かと思います。HTTPSにすることも、現在ではほぼ必須です。
③上記②が不可能な場合、IPアドレスの偽装をチェックしてアクセスを防ぐなどの方法は可能でしょうか?
IPアドレスの偽装チェックは、TCP/IPのレイヤーでなされているので、アプリケーション側では不要だし、偽装のチェックをアプリケーションで実装することは難しいと思います。大昔にはTCP/IPでIPアドレスの偽装ができた時代がありましたが、これはTCPの脆弱性として修正されています。UDPの場合は、IPアドレスの偽装は容易なので、上位レイヤーで対策する必要があります。HTTPはTCPなのでIPアドレスは信頼できると考えてよいかと思います。
もっとも、TCPの場合でも、利用者とウェブサーバーの通信経路上の端末であればIPアドレスは偽装できますが、その状況は通常想定しなくてもよいでしょう。
コメントへの回答を追記します。
①現状、当該PHPファイルへのリンクは、自社で提供しているクライアントソフト(exe)から、HTTPS通信で情報を送信しているところだけです。その場合、HTTPSでもリンク先がわかってしまうものでしょうか。
通信からはリンク先URLはわかりません。通信先のIPアドレスとホスト名はわかりますが、URLのパス名はわかりません。
しかし、exeそのものを解析されたりすると、わかる可能性が高いと思います。
②ウェブサーバーはIP制限されているため、外部の侵入はあまり考えられません。今一番可能性があるのは「ディレクトリリスティングが有効になっていた」ということだと思っているのですが、無効になる場合はどんなケースなのでしょうか?
端的にいうと設定が間違っている場合です。以下のように書かれていますが…
①ドキュメントルートの.httaccessに下記の記述があります。
Options -Indexes
DirectoryIndex index.html index.php
.httaccessではなくて、.htaccess ですね。質問時のタイプミスかもしれませんが、仮にサーバー上でもファイル名が間違っていると、この設定は有効になりません。
あるいは、httpd.conf側で AllowOverride None などの設定があると、.htaccess があっても無視されます。