重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【GOLF me!】初月無料お試し

MySQLでデータベースを作成して、データベース認証させてコンテンツを表示するプログラムを書いているのですが、パスワードやユーザー名をルートディレクトリの外に置いてrequire_onceする意味が今ひとつわからないので教えて下さい。

require_once('../../../DBparameter.php'); // DBparameter.phpの中にパスワードやユーザー名

として、ルートディレクトリの外にDBparameter.phpを置けば確かに、パスワードやユーザー名を見ることはできませんが、このプログラムが存在するフォルダ内をのぞけるぐらいの詳しい人であれば、このプログラムを見るのは簡単にできると思うんですが、そうすると、

$con = mysql_connect(host, username, password);

などとしてデータベースを開き、結局はデータベース内の情報を抜かれてしまうような気がするのですが、どうなんでしょうか?
確かに、データを抜き取るためのプログラムを他人のドメインにアップロードするのは簡単ではないので、ほとんど無理だとは思うんですが、それならばスクリプト内にパスワードやユーザー名をそのまま書いてもいいのではないかという気がするんです。

A 回答 (2件)

 データベースをリモートでメンテナンスできるようにしようとすると、何らかの方法でMySQLにダイレクトにアクセスできる道を作ることになりますよね。

その道を知っている人にとっては、残る関門は、IDとパスワードだけです。別に、人のドメインに直接プログラムをアップロードするまでも無いので、IDとパスワードが漏れちゃったら、大変です。(MySQLでは、ID毎にクライアントのIPを制限するのが普通なので、そこまでは普通至らない物ですが。それでも、最大の関門を破ったことに変わりはありません。)

 さて、ルートディレクトリー配下で、スクリプトファイルに対して、クライアントからアクセスした場合は、普通は、スクリプト(例えばPHP)が実行されるのが普通です。これが正しい姿ですが・・・
 webサーバーを一から構築した人は、クライアントからアクセスするとブラウザーにスクリプトのソースが表示されて、悲鳴を上げるという体験を、必ず一度はするものです。
 そう。webサーバーのちょっとした設定間違いで、簡単にこんな事故はおこるものなんです。
 さて、このスクリプトのソースにIDとパスワードが堂々と書いてあったら?はい。事故=ID・パスワードの漏洩発生です。
 というわけで、クライアントからアクセスできる領域のファイルにはIDやパスワードは書きたくないものです。
 ですから、まず、IDとパスワードを別のファイルに分けます。
 このファイルを同じ場所においたら、結果は一緒です。このファイル名はちゃんとスクリプトに書いてありますから、そのファイル名をurlにしてもう一度アクセスするだけになってしまいます。
 
 ですから、ルートディレクトリー配下には、このようなファイルは置かないようにするのです。さすがに、相当の間違いをやらかしても、ルートディレクトリー配下意外の場所をweb経由でアクセスできるようになんてことにはなりませんから、大分、安心度が大きくなります。(まぁ、ルートディレクトリーの設定そのものを間違えれば・・・でも、その場合は、別の心配をした方が良いです。被害はデータベースのデータを抜く程度では収まりません。でもサーバーのOSレベルで、webサーバーシステムのアクセス権限はルートディレクリー配下に制限することが普通ですから、その意味でも、ルートディレクトリの外は、結構厳重に守られている物です。)

 設定を間違えなくても、webサーバーのシステムにセキュリティーホールがあれば、同じ結果になることはあり得ます。でも、ルートディレクリー以外の所まで平気で見に行けるなんて巨大なホールはそうそう出ませんし、ちゃんと設定していれば、OSの保護も期待できます。

 まぁ、セキュリティーに完璧はありません。少しでも、心配事をひとつずつつぶしていくのが基本です。心配事をひとつつぶす毎にセキュリティーは一段階上がります。
    • good
    • 0
この回答へのお礼

mitonekoさん、ご回答ありがとうございます。

>webサーバーを一から構築した人は、クライアントからアクセスするとブラウザーにスクリプトのソースが表示されて、悲鳴を上げるという体験を、必ず一度はするものです。

こんなことがあるんですか? 知りませんでした。ちょっと心配が増えました。

現在、SQLiteを使ってサーバー上に6つほどデータベースを作成しています。
そのうちの3つは、基本的に見られたくないのでBASIC認証をかけています。さらにそのうちの1つはどこの誰か特定できるレベルではありませんが、個人名が書かれています。今後、さらに秘匿性の高いデータベースを作成しようと考えています。
SQLite+BASIC認証というのはセキュリティとしてはだめなんだろうなと以前から感じておりましたが、mitonekoさんのコメントを見て確信しました。
現在、SQLiteからMySQLへの移行をおこなっているのですが、1つは移行が終了しました。BASIC認証もデータベース認証に変更予定です。マッタリと移行しようかと考えておりましたが、ちょっと急いだほうがいいようですね。

ご回答ありがとうございました。

お礼日時:2013/11/01 06:51

>このプログラムが存在するフォルダ内をのぞけるぐらいの詳しい人であれば


これは内部の人に限られます。内部からはパスワードの秘匿性はないです。


次にWebクライアント側からの危険性ですが、以下の危険性をなるべく少なくする為です。
・Webサーバの設定ミスでルート配下が全て見られるパターン。
・セキュリティホールが見つかりルート配下が全て見られるパターン。


セキュリティに100%はなく、何重にもよる防止策しかないので上記のパターンを潰す意味でのルート外配置ですね。
    • good
    • 0
この回答へのお礼

sora1515さん、ご回答ありがとうございます。

>Webサーバの設定ミスでルート配下が全て見られるパターン。

ネットでごくまれにこういうシーンを見ることがありますよね。最近はあまりないような気がしますが。

最近、ロリポップからXserverに引越したのですが、Xserverは基本認証のパスワードもルートディレクトリの外の専用フォルダに自動的に入ります。
MySQLは最近始めたばかりで、パスワードはルートディレクトリの外側にフォルダを作成してその中に配置しているものの、どの程度安全なのか疑問だったので質問しました。

>>このプログラムが存在するフォルダ内をのぞけるぐらいの詳しい人であれば
>これは内部の人に限られます。内部からはパスワードの秘匿性はないです。

当然なのだとは思いますが、かなり安心できるコメントではあります。
ご回答ありがとうございました。

お礼日時:2013/10/31 18:55

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す