Webサービスを作成しています。言語はPHPです。

データベースにアクセスするために、どこかにユーザーIDとパスワードを保持させる必要があります。
その際、どのように保持させるのが一般的なのでしょうか。

プログラムに直接ハードコーディングするのはセキュリティ面でよくないかと思います。
しかし、iniファイルなどに書いたところで、そのiniファイルを読み取られればパスが漏れてしまいます。

セキュリティ上安全にユーザーIDとパスワードを保持させるにはどのようにすればよいでしょうか。

回答の条件
  • 1人5回まで
  • 13歳以上
  • 登録:2011/09/11 16:22:23
  • 終了:2011/09/11 17:36:33

ベストアンサー

id:munyaX No.2

munyaX回答回数120ベストアンサー獲得回数242011/09/11 17:16:56

ポイント50pt

Webサーバ等からDBサーバへ接続する前提ですが、

よく見かけるのは

 ・PHP上で定数、または変数として管理

 ・独自の設定ファイル(XML,YAML,ini,JSON,CSVなど)に記述

でしょうか。

DBへ接続するためのパスワード自体に特別な暗号化(復号化)等を行っている

サービスは目にしたことがないです。

#よく利用されているフレームワークCakePHP、symfonyや、言語は違いますが

#Ruby on Railsなども、いずれかの方法で実装されています。



理由としては、

・Webサーバなどアプリ側からDBへ接続し情報を取得する際、

 一連の動作を素早く行う必要があり、余計な処理を極力省きたい。

・DB側で例えばiptables、hosts.allow|denyなどを利用し、接続元サーバを

 絞っていれば、セキュリティはある程度担保される。

といったものがあげられます。


一番知られてはいけないのは外部の一般ユーザーですから、そこが防げれば

原則大丈夫だというサービスが大部分を占めているのではと思います。

 ※仮に知られたとしても、普通はDBサーバでアクセス制限をかけますから、

  知ったところでアプリサーバ自体のアカウントをクラックされない限りは

  使えないですが。



あとはどれだけセキュリティを気にするか、コストとのトレードオフになります。

(コスト=毎回の処理コスト、実装時の開発コスト)

 ・一般的なDB、例えばMySQLやOracleをそのままで利用する場合、

  パスワードを暗号化しても、必ず復号化する必要がありますので

  その処理コスト

   ※そもそも復号化が前提なのでプログラムが読める人なら

    解読されるのは時間の問題。

 ・外部のサーバに保存し、接続の度に毎回問合せて取得する場合も、

  処理時間や全体的な開発工数が上がります。

   ※この方法はそもそも通信を行って取得することで

    別のリスクが発生する。


時々、Webサーバの設定を失敗してソースコードが丸見えになってしまうような

ことは起こりえますので、ドキュメントルート下のファイルにはPHPのファイルで

あっても書かないのが良いのは確かです。

 ※数年前にmixiでこの現象が起こって話題になってましたね。


暗号化(復号化)も、XORのような単純なものであれば対して負荷にもならないで、

気になるようならかけても良いかもしれません。

http://itpro.nikkeibp.co.jp/article/COLUMN/20060131/228211/


参考程度に。

id:Gaasu

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

2011/09/11 17:36:12

その他の回答(1件)

id:Jupiter2100 No.1

じゅぴたー回答回数444ベストアンサー獲得回数742011/09/11 16:55:14

ポイント50pt

Webサーバ経由でアクセスできないフォルダに、Webサーバ経由でアクセスできないファイル名で保存し、PHPスクリプトからincludeするのが無難です。


たとえば、Apacheでは "user/public_html/" が公開フォルダであることが多いのですが、"user/var" のようなフォルダに保存することです。

また、Apacheでは "."(ドット) で始まるファイル名は公開されないので、".opqrstu" のような意味不明のファイル名にしておくといいでしょう。

id:Gaasu

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

2011/09/11 17:36:04
id:munyaX No.2

munyaX回答回数120ベストアンサー獲得回数242011/09/11 17:16:56ここでベストアンサー

ポイント50pt

Webサーバ等からDBサーバへ接続する前提ですが、

よく見かけるのは

 ・PHP上で定数、または変数として管理

 ・独自の設定ファイル(XML,YAML,ini,JSON,CSVなど)に記述

でしょうか。

DBへ接続するためのパスワード自体に特別な暗号化(復号化)等を行っている

サービスは目にしたことがないです。

#よく利用されているフレームワークCakePHP、symfonyや、言語は違いますが

#Ruby on Railsなども、いずれかの方法で実装されています。



理由としては、

・Webサーバなどアプリ側からDBへ接続し情報を取得する際、

 一連の動作を素早く行う必要があり、余計な処理を極力省きたい。

・DB側で例えばiptables、hosts.allow|denyなどを利用し、接続元サーバを

 絞っていれば、セキュリティはある程度担保される。

といったものがあげられます。


一番知られてはいけないのは外部の一般ユーザーですから、そこが防げれば

原則大丈夫だというサービスが大部分を占めているのではと思います。

 ※仮に知られたとしても、普通はDBサーバでアクセス制限をかけますから、

  知ったところでアプリサーバ自体のアカウントをクラックされない限りは

  使えないですが。



あとはどれだけセキュリティを気にするか、コストとのトレードオフになります。

(コスト=毎回の処理コスト、実装時の開発コスト)

 ・一般的なDB、例えばMySQLやOracleをそのままで利用する場合、

  パスワードを暗号化しても、必ず復号化する必要がありますので

  その処理コスト

   ※そもそも復号化が前提なのでプログラムが読める人なら

    解読されるのは時間の問題。

 ・外部のサーバに保存し、接続の度に毎回問合せて取得する場合も、

  処理時間や全体的な開発工数が上がります。

   ※この方法はそもそも通信を行って取得することで

    別のリスクが発生する。


時々、Webサーバの設定を失敗してソースコードが丸見えになってしまうような

ことは起こりえますので、ドキュメントルート下のファイルにはPHPのファイルで

あっても書かないのが良いのは確かです。

 ※数年前にmixiでこの現象が起こって話題になってましたね。


暗号化(復号化)も、XORのような単純なものであれば対して負荷にもならないで、

気になるようならかけても良いかもしれません。

http://itpro.nikkeibp.co.jp/article/COLUMN/20060131/228211/


参考程度に。

id:Gaasu

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

2011/09/11 17:36:12

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません