スレッド表示 | フラット表示〕 全トピック 920 件中 318 番目 次≫ ≪前

phpでMySQLに接続する際にパスワードを隠す方法

created: 2005-11-26 20:15 | modified: 2005-11-27 18:12 | reply: 5

[2761] phpでMySQLに接続する際にパスワードを隠す方法

user: らんど | created: 2005-11-26 20:15
Webからユーザー登録できるサイトを作る際に、
PHPスクリプトを用いてMySQLに接続したいのですが、
その際、phpスクリプト内にDB接続のパスワードを入れな
ければなりません。パスワードは管理用のもので、
見られたくないのですが、スクリプトソースにパスワード
を埋め込まず、うまく隠す方法はないでしょうか?

よろしくお願いいたします。

環境
OS:WinXP SP2
PHP:4.4.0
Apache:2.0.54
MySQL:4.0.25
reply: 2763 2765 2767 返信 編集 削除

[2763] Re. phpでMySQLに接続する際にパスワードを隠す方法

user: ゆうじ | created: 2005-11-27 01:30
こんばんわ。

PHPスクリプトにさえ記述しておけば
普通は表示されることはありませんが、
万が一が無いともいえませんからね。

スクリプトに埋め込まない方法は思いつきませんが
私は、実行ファイルとパスワード記述したファイルを分けています。

DSN.php (パスワード記述ファイル)
<?php
$dsn = array(
'host' => 'localhost',
'user' => 'yourname',
'pass' => 'xxxxxxx'
);
?>

db_connect.php (実行ファイル)
<?php
require_once 'DSN.php';

$conn = mysql_connect(
$dsn['host'],
$dsn['user'],
$dsn['pass']
);

//
// 以降DBの処理いろいろ
//

?>

これだと何かの間違いで実行ファイルのコードが
表示されたとしてもパスワードはわかりませんし、
DSN.php に直接アクセスしたとしても
phpファイルなので実質何も出力されません。

DSN.php に直アクセスされて万が一コードが・・・とご心配なら
DSN.php をドキュメントルートよりも上位ディレクトリに置けば
HTTP経由でのアクセスは一切出来なくなるのでほぼ完璧ではないでしょうか。
Parent: 2761  返信 編集 削除

[2765] Re.phpでMySQLに接続する際にパスワードを隠す方法

user: ach | created: 2005-11-27 04:32
誰から隠したいかによって話は変わります。

まず内部ユーザーですが、PCの別ユーザーやApache上のユーザーに対してパスワードを隠すことは基本的に出来ません。
WindowsもWin版のApacheもユーザー管理がUNIXほどよろしくないためです。
ほとんど唯一の方法はエンコードするということでしょう。多くのものは有償ですが、APCでも目を欺くぐらいは出来るかもしれません。
サーバーを複数立ち上げるといった強引な手法もありますが・・・
http://www.stackasterisk.jp/tech/php/apc01_01.jsp
http://jp.php.net/manual/en/ref.apc.php

次に外部ユーザー、クライアントから隠蔽する場合
Windowsの環境変数(PATHとかがはいってるやつ)に格納するという方法があります。
echo getenv('PATH'); //環境変数PATHの表示
この方法ではディレクトリトラバーサルやNullバイトアタックに耐えられます。
でもOSコマンドインジェクションには耐えれません。
http://www.zend.co.jp/tech/index.php?%A5%BB%A5%AD%A5%E5%A5%EA%A5%C6%A5%A3%BB%D8%BF%CB
外部ファイルの利用は(セキュリティーホールにより)ソースコードが見えている状況ではその外部ファイルも見える可能性も高いので、私はよろしく無いと思ひます。
Parent: 2761  返信 編集 削除

[2767] ありがとうございました。追加でご質問です。

user: らんど | created: 2005-11-27 09:33
ゆうじ さま
ach さま

大変、貴重な回答をいただきまして、本当にありがとうございます。

また、恐縮ですが追加の質問をさせていただけないでしょうか。

ゆうじさまのご回答で、「docrootより上位ディレクトリに置けば」とありますが、docrootより上位はphpからはアクセスできないようにしたいと考えております。そのほうが安全かと思いまして。。。別ファイルにしてもCGIで読まれたりできてしまうんでしょうか?

achさまのご回答で、Windowsの環境変数に格納するという方法とありますが、

<? mysql_connect('host','user','pass'); ?>

には具体的にどのように変数を格納していけばよいのですか?イメージがつかめずすみませんがご教示いただければ助かります^^;


すみませんが、お力添えをお願いいたします。
Parent: 2761  reply: 2768 返信 編集 削除

[2768] Re.ありがとうございました。追加でご質問です。

user: ach | created: 2005-11-27 13:40
誰から隠したいのかを書いてくれるとうれしい。

> <? mysql_connect('host','user','pass'); ?>
> には具体的にどのように変数を格納していけばよいのですか?イメージがつかめずすみませんがご教示いただければ助かります^^;
環境変数にHOST,USER,PASSの値を格納して
http://www.atmarkit.co.jp/fwin2k/win2ktips/189setenvv/setenv.html
<?php
mysql_connect(getenv('HOST'),getenv('USER'),getenv('PASS'));
?>
とこんな感じです。echo getenv('PATH');を試してみましたか?

>別ファイルにしてもCGIで読まれたりできてしまうんでしょうか?
PerlやASPなど他の言語を使えば読めます。shell_execを許可するとPHPで見えないはずのものも見えてきます。
また、docrootより上位をPHPからアクセスできないようにするとパスワードが必要なPHPからもアクセスできなくなるので、常にではなくともPHPからは見える場所にファイルを置く必要があります。
Parent: 2767  reply: 2769 返信 編集 削除

[2769] 外部から隠したいのですが。。。

user: らんど | created: 2005-11-27 18:12
ach さま ゆうじさま

仰せのとおりでございます。
誰から、どのように隠したいのかが重要でなのですね。achさまの言葉の意味が分かりました。分かりづらい質問ですみませんでした。

getenvの方法でうまくいくことは確認できましたが、登録ユーザがgetenv()を実行するとパスワードが丸見えになるんですね。。。

php.ini上でdisable_functions getenvとすると自分も実行できなくなるんですね。

そこで考えたのですが、
open_basedirディレクトリを httpd.confにセットし、制限ディレクトリ配下の外部ファイルにパスワードを埋め込もうと考えました。

まだ、悩みはつきませぬが、努力します。
わかりづらい質問にもかかわらず、貴重なご回答を本当にありがとうございました。
今後ともよろしくお願いいたします。
Parent: 2768  返信 編集 削除
スレッド表示 | フラット表示〕 全トピック 920 件中 318 番目 次≫ ≪前
ページの一番上へ
Googleグックマークに登録 Yahooグックマークに登録 livedoorクリップに登録 @niftyクリップに登録 はてなブックマークに登録 deliciousに登録 Buzzurlに登録 FC2ブックマークに登録
最近更新された掲示板トピックス
管理人Blog
Yahoo Search

最近更新したNote
PHPマニュアル
今日のブックマーク
PHPマニュアル関数検索
関数名を入力し検索ボタンをクリック↑