MySQLでパスワードをrequireする意味

このQ&Aのポイント
  • MySQLでデータベース認証させてコンテンツを表示するプログラムを書いている場合、パスワードやユーザー名をルートディレクトリの外に置くことの意味について教えてください。
  • ルートディレクトリの外にDBparameter.phpを置くことで、パスワードやユーザー名を見ることを防ぐことができます。
  • しかし、このプログラムが存在するフォルダ内をのぞけるぐらいの詳しい人であれば、このプログラムを見ることは容易です。そのため、より安全な方法を検討する必要があります。
回答を見る
  • ベストアンサー

MySQLでパスワードをrequireする意味

MySQLでデータベースを作成して、データベース認証させてコンテンツを表示するプログラムを書いているのですが、パスワードやユーザー名をルートディレクトリの外に置いてrequire_onceする意味が今ひとつわからないので教えて下さい。 require_once('../../../DBparameter.php'); // DBparameter.phpの中にパスワードやユーザー名 として、ルートディレクトリの外にDBparameter.phpを置けば確かに、パスワードやユーザー名を見ることはできませんが、このプログラムが存在するフォルダ内をのぞけるぐらいの詳しい人であれば、このプログラムを見るのは簡単にできると思うんですが、そうすると、 $con = mysql_connect(host, username, password); などとしてデータベースを開き、結局はデータベース内の情報を抜かれてしまうような気がするのですが、どうなんでしょうか? 確かに、データを抜き取るためのプログラムを他人のドメインにアップロードするのは簡単ではないので、ほとんど無理だとは思うんですが、それならばスクリプト内にパスワードやユーザー名をそのまま書いてもいいのではないかという気がするんです。

  • MySQL
  • 回答数2
  • ありがとう数15

質問者が選んだベストアンサー

  • ベストアンサー
  • mitoneko
  • ベストアンサー率58% (469/798)
回答No.2

 データベースをリモートでメンテナンスできるようにしようとすると、何らかの方法でMySQLにダイレクトにアクセスできる道を作ることになりますよね。その道を知っている人にとっては、残る関門は、IDとパスワードだけです。別に、人のドメインに直接プログラムをアップロードするまでも無いので、IDとパスワードが漏れちゃったら、大変です。(MySQLでは、ID毎にクライアントのIPを制限するのが普通なので、そこまでは普通至らない物ですが。それでも、最大の関門を破ったことに変わりはありません。)  さて、ルートディレクトリー配下で、スクリプトファイルに対して、クライアントからアクセスした場合は、普通は、スクリプト(例えばPHP)が実行されるのが普通です。これが正しい姿ですが・・・  webサーバーを一から構築した人は、クライアントからアクセスするとブラウザーにスクリプトのソースが表示されて、悲鳴を上げるという体験を、必ず一度はするものです。  そう。webサーバーのちょっとした設定間違いで、簡単にこんな事故はおこるものなんです。  さて、このスクリプトのソースにIDとパスワードが堂々と書いてあったら?はい。事故=ID・パスワードの漏洩発生です。  というわけで、クライアントからアクセスできる領域のファイルにはIDやパスワードは書きたくないものです。  ですから、まず、IDとパスワードを別のファイルに分けます。  このファイルを同じ場所においたら、結果は一緒です。このファイル名はちゃんとスクリプトに書いてありますから、そのファイル名をurlにしてもう一度アクセスするだけになってしまいます。    ですから、ルートディレクトリー配下には、このようなファイルは置かないようにするのです。さすがに、相当の間違いをやらかしても、ルートディレクトリー配下意外の場所をweb経由でアクセスできるようになんてことにはなりませんから、大分、安心度が大きくなります。(まぁ、ルートディレクトリーの設定そのものを間違えれば・・・でも、その場合は、別の心配をした方が良いです。被害はデータベースのデータを抜く程度では収まりません。でもサーバーのOSレベルで、webサーバーシステムのアクセス権限はルートディレクリー配下に制限することが普通ですから、その意味でも、ルートディレクトリの外は、結構厳重に守られている物です。)  設定を間違えなくても、webサーバーのシステムにセキュリティーホールがあれば、同じ結果になることはあり得ます。でも、ルートディレクリー以外の所まで平気で見に行けるなんて巨大なホールはそうそう出ませんし、ちゃんと設定していれば、OSの保護も期待できます。  まぁ、セキュリティーに完璧はありません。少しでも、心配事をひとつずつつぶしていくのが基本です。心配事をひとつつぶす毎にセキュリティーは一段階上がります。

yahooyaffo
質問者

お礼

mitonekoさん、ご回答ありがとうございます。 >webサーバーを一から構築した人は、クライアントからアクセスするとブラウザーにスクリプトのソースが表示されて、悲鳴を上げるという体験を、必ず一度はするものです。 こんなことがあるんですか? 知りませんでした。ちょっと心配が増えました。 現在、SQLiteを使ってサーバー上に6つほどデータベースを作成しています。 そのうちの3つは、基本的に見られたくないのでBASIC認証をかけています。さらにそのうちの1つはどこの誰か特定できるレベルではありませんが、個人名が書かれています。今後、さらに秘匿性の高いデータベースを作成しようと考えています。 SQLite+BASIC認証というのはセキュリティとしてはだめなんだろうなと以前から感じておりましたが、mitonekoさんのコメントを見て確信しました。 現在、SQLiteからMySQLへの移行をおこなっているのですが、1つは移行が終了しました。BASIC認証もデータベース認証に変更予定です。マッタリと移行しようかと考えておりましたが、ちょっと急いだほうがいいようですね。 ご回答ありがとうございました。

その他の回答 (1)

  • sora1515
  • ベストアンサー率58% (54/92)
回答No.1

>このプログラムが存在するフォルダ内をのぞけるぐらいの詳しい人であれば これは内部の人に限られます。内部からはパスワードの秘匿性はないです。 次にWebクライアント側からの危険性ですが、以下の危険性をなるべく少なくする為です。 ・Webサーバの設定ミスでルート配下が全て見られるパターン。 ・セキュリティホールが見つかりルート配下が全て見られるパターン。 セキュリティに100%はなく、何重にもよる防止策しかないので上記のパターンを潰す意味でのルート外配置ですね。

yahooyaffo
質問者

お礼

sora1515さん、ご回答ありがとうございます。 >Webサーバの設定ミスでルート配下が全て見られるパターン。 ネットでごくまれにこういうシーンを見ることがありますよね。最近はあまりないような気がしますが。 最近、ロリポップからXserverに引越したのですが、Xserverは基本認証のパスワードもルートディレクトリの外の専用フォルダに自動的に入ります。 MySQLは最近始めたばかりで、パスワードはルートディレクトリの外側にフォルダを作成してその中に配置しているものの、どの程度安全なのか疑問だったので質問しました。 >>このプログラムが存在するフォルダ内をのぞけるぐらいの詳しい人であれば >これは内部の人に限られます。内部からはパスワードの秘匿性はないです。 当然なのだとは思いますが、かなり安心できるコメントではあります。 ご回答ありがとうございました。

関連するQ&A

  • PHP+MySQL mysql_connectのエラー

    PHP初心者なのですが、 PHPを使用して外部ホストのMySQLデータベースから データを取り出すプログラムを開発しています。 mysql_connect関数でデータベースに接続する段階で 内部エラーとなってしまいます。 プログラムは以下のようなものです。 $url = "000.000.00.00";//外部ホストのアドレスです $user = "username"; $pass = "password"; $db = "databasename"; $link = mysql_connect($url,$user,$pass) or die("MySQLへの接続に失敗しました。"); ホストアドレスやユーザー名、パスワードは 以前VisualBasic+ODBC+MySQLでデータを読み込んでいたときに 使用していたものなので、間違いはないと思います。 非常に初歩的な質問で申し訳ありませんが、 非常に困っております。 ご助言よろしくお願いします。

    • 締切済み
    • PHP
  • MySQLでパスワードを設定したら、使えない

    XAMPPを使って、AppacheとMySQLなどをインストールしました。 MySQLは順調に動いていたのですが、 rootユーザーにpasswordを設定するつもりで、mysqlデータベースのuserテーブルのlocalhost/rootのレコードにパスワードを設定して、flush privilegeを実行しました。 一度、xamppコントロールパネルからmysqlAdminを再起動したところ、今まで使っていたデータベースが使えなくなりました。 どうすれば使えるようになりますか? 初心者です。すみません。よろしくお願いします。

  • mysqlのデータを変数に代入する方法

    php/mysql初心者です。かなりつたない内容になっているかもしれませんが、ご容赦ください。 過去ログで何のワードで検索したらいいかもわからなかったので質問投稿させていただきます。 データベースに入っている情報を変数に代入して POSTメソッドで送信したいと考えています。 DBからSELECTで特定の情報を取り出す ↓ 変数に代入する ↓ POSTで送信 このような流れで処理したいです。 [環境] PHP 5.2.17 MySQL 5.1.59 今書いているソースを一部抜粋します。 ------------ <?php if ($_SERVER['REQUEST_METHOD']=="POST") { require_once "Request.php"; $req =& new HTTP_Request("【送信先URL】"); $req->setMethod(HTTP_REQUEST_METHOD_POST); $connect = mysql_connect('localhost', '【DB名】', '【パスワード】'); if (!$con) { exit('データベースに接続できませんでした。'); } $result = mysql_select_db('【データベース名】', $connect); if (!$result) { exit('データベースを選択できませんでした。'); } $db = mysql_query('SELECT username FROM userinfo where id=6', $connect); $u="$db"; $req->addPostData("username", $u); $con = mysql_close($con); if (!$con) { exit('データベースとの接続を閉じられませんでした。'); } ?> ------------ ※idが6のusernameは「テスト太郎」になっています。 上記のPHPを実行すれば"userinfo"テーブル内の"id"が6の"username"が 送信されると思いましたが、実際は異なる内容が送信されます。 送信されるデータはusernameの内容ではなく "Resource data"となっています。 なぜ$uに代入した値がResource dataという内容になるのでしょうか。 初歩的な質問かもしれませんが、 ご教示の程よろしくお願いいたします。

    • ベストアンサー
    • MySQL
  • パーミッションの設定

    最近 PHP と MySQL の勉強をはじめました。 パーミッションについて教えてください。 サーバをレンタルしてPHP で MySQL に接続してデータを読み込んでいます。MySQL に接続する際の サーバ名,ユーザ名,パスワード,データベース名 は info.php という別のPHPファイルに書き込み、それを require_once(info.php) で読み込んでデータベースに接続しています。 info.php は data というディレクトリに格納していますが、セキュリティのためにパーミッションを設定したほうがいいと聞いたのですが data と info.phpのパーミッションはいくつにしたらよいのでしょうか?

    • ベストアンサー
    • PHP
  • データベースに登録してあるパスワードを画面に表示

    データベース(MYSQL)に登録してあるパスワードを暗号化(ハッシュ化)して保存してあります。 それをPHPに表示させる際どのようにもとのパスワードに戻して表示させるかがわかりません。 もとのパスワード abcd とする。 ハッシュ化したものを仮に123456789とする。 データベース上では123456789となっているが PHP上ではabcdとパスワードを表示させる方法がわかりません。 やりたいのは、 PHPのシステムにログインしている状態で別のシステムにリンクで飛んだ際、 「ユーザ」「パスワード(abcd)」で自動ログインさせたいのです。 ※ユーザは暗号化していないので「ユーザ」データを引き継いでいく事ができるのですが パスワードが暗号化されている為、どのように表示させたら良いのかが分からないのです。 <a target="_blank" href="http://192.***.**.****/●●●/portal/?action=ALJLoginUser&username=<?php echo htmlspecialchars($_SESSION['GO_SESSION']['username']); ?>&password=<?php echo htmlspecialchars($_SESSION['GO_SESSION']['password']); ?>" > 上記ですと]['username']は表示できますが['password']は空になってしまいます。 どのようにしたら良いのでしょうか? どうぞ宜しくお願い致します。

  • xamppの設定の問題でしょうか。mysqlが全く使えません。

    PHPを独学しています。(プログラムはもちろん、PC自体、ほぼ初心者です) xamppでapacheとmysqlをインストールしたのですが、mysqlが(データベースが?)全く使えない状態です。 自分でいじったことは、 http://www.mtde.info/0210winxampp/winxampp_050.php ↑のページを参照しながら、 rootのパスワードの設定と、「xamppのディレクトリ制御」のユーザー名とパスワードの設定です。 (http://www.mtde.info/0210winxampp/winxampp_060.phpに書かれていることも設定しました) その後コマンドプロンプトで cd C:\xampp\mysql\binと入力し、(C:\xampp\mysql\bin> となり) ここでmysqlと入力することで 左側がmysql> と表示されるようにはなっているのですが、そこから何を打っても反応してくれません。(ただ改行されて、-> と表示されるだけなのです) 例えば、create database testdb と入力し、「testdb」というデータベースを作ろうと意図しても、作られた形跡はなく、 (show databases; としてやはり無反応ですし、PCでファイル検索しても出てきません) xamppの管理ツールのデモのCDコレクションをクリックしても、 Warning: mysql_connect() [function.mysql-connect]: Access denied for user 'root'@'localhost' (using password: NO) in C:\xampp\htdocs\xampp\cds.php on line 77 データベースを接続できません! MySQLは稼動していますか?またはパスワードを変えませんでしたか? 上のように表示されます。xamppのコントロールパネルで「起動」しているのは間違いありません。 パスワードを変えたか?と聞かれたとき、思い浮かぶのは冒頭に書いたことだけです。 ならば、再度コマンドプロンプト上でパスワードを変更してみようと set password for root @localhost=password('12345'); などと入力してみても、パスワードが変更されることもありません。(冒頭で設定したパスワードのままです) 何をどのようにすれば、mysqlを使えるようになるのでしょうか? 教えてください。お願いします。

  • Parse errorなんですが・・・

    Parse error: syntax error, unexpected '&' in C:\Program Files\Apache Group\Apache2\htdocs\php10\dbtest1.php on line 2 というエラーがでます。 ホスト名、ユーザー名、パスワードはあっていると思うんですが・・・ というかホスト名とはなんのことでしょうか?? ユーザー名、パスワードはデータベースでの設定ですよね? <?php &con=mysql_connect("localhost","sample","password") or die("接続できません。"); print"接続に成功しました。"; mysql_close(&con); ?> 本当に初心者ですみません ご教授、お願いいたします。

    • ベストアンサー
    • PHP
  • MySqlのパスワードに「"」が含まれた場合の扱い

    MySqlのパスワードに「"」が含まれています。 このMySqlをWindowsから呼び出す方法を教えてください。 パスワード部分を対話式で入力するのはできます。 バッチ処理でアクセスする方法が知りたいです。 なお、シェル(バッチ)ファイルにパスワードを記述するのはセキュリティ的に云々の話は結構です。 例 ユーザー:user1 パスワード:aa"bb データベース:database1  ↓このようなパスワードがセットされています。 SET PASSWORD FOR user1@localhost=PASSWORD('aa"bb'); linux(bash)からは普通にアクセスできます。  mysql --database database1 -u user1 --password='aa"bb' Windows(dos)からはエラーになります。  mysql --database database1 -u user1 --password='aa"bb' というかそもそも「abcd」のような普通のパスワードもシングルクオートするとダメです。  mysql --database database1 -u user1 --password='abcd' ・・・ ×  mysql --database database1 -u user1 --password=abcd ・・・ ○ なので裸で記述してみますが  mysql --database database1 -u user1 --password=aa"bb これは当然ダメです。 こんなことしてみましたが  mysql --database database1 -u user1 --password=aa^"bb ダメでした。 何か方法ありませんか?

    • ベストアンサー
    • MySQL
  • my.iniで設定するパスワードの意味がよくわかりません

    4.0.16から、4.0.26にバージョンアップしたのですが、root権限や、パスワードが よくわかりません。 4.0.16の時は、mysql.exeを開き、DOS窓で「show databases;」とたたくだけで、 testとmysqlが表示されましたが、 4.0.26や、4.1x系ですと、testしか表示されません。たとえば、 show databases -A -uroot -pPASSWORD;  や、 show databases -A -urootD;  などととやっても、↓のようになってしまいます。 ERROR 1064: You have an error (中略)'-A -uroot -p PASSWORD' at line 1 他方、4.0.26で、my.iniに、   [WinMySQLadmin]   user=root   password=mypassword と設定してあるものが認識されていないようです。 既存のPHP+MySQL4.0.16(ローカルで使うだけのものなので、ユーザー名、パスワードなし)で 構築したPHPプログラムがあるのですが、これを 今回インストールしたMySQL 4.0.26の組み合わせに適用しても動かなかったので、   $DBSERVER = "localhost";   $DBUSER = "root"; //←ここと、   $DBPASSWORD = "mypassword"; //←ここです   $DBNAME = "mydb";   $con = mysql_connect($DBSERVER, $DBUSER, $DBPASSWORD);   $selectdb = mysql_select_db($DBNAME, $con); とやってみましたが、エラーになってしまうので、   $DBPASSWORD = ""; //←ここを空白にする とやったら、MySQLに接続できました。 my.iniに記入したものは、適用されていないのでしょうか?

    • ベストアンサー
    • MySQL
  • PHPからMySQLの起動について

    PHPからMySQLの起動について レンタルサーバーを借りてPHP,MySQLの勉強をしています。 PHPからMySQLの起動ができなくて困っていますので、教えていただきたいのですが、 <?PHP $dbkidou = mysql_connect("どこのサーバーか","ユーザー名","パスワード"); //データベースの起動ができなかった場合 if ($dbkidou == False) { print ("error"); exit; } $db = "データベースの名前"; ?> まずレンタルサーバーのドメインを「abc.com」としています。これに対するユーザー名が「def」、パスワードが「ghi」です。 そしてMySQLデータベースは「jkl_m」,「jkl_n」の2つを設けていて(phpMyAdminで作成しました)MySQLユーザ名が「opq」、パスワードが「rst」です。今回は「jkl_m」のサーバーを起動させたいのですが、上記PHP文の、 どこのサーバーか ユーザー名 パスワード データベースの名前 の各部分にどれを書けば良いのでしょうか? 何通りか試しているのですが、うまくいかないんです…

    • ベストアンサー
    • PHP