2012-01-05 17 views
2

私は、複数のウェブサイトでMySQLデータベースの独自のインスタンスを使用しても同じPHPコピーを使用する環境に取り組んでいます。これは明らかに各Webサイトの接続資格情報を意味し、より多くのユーザーがパスワードを必要とするため、ハッカーにとってより望ましいターゲットです。ただ、パスワードで、データベースにを接続しませだから私はに使用されるパスワードについて話している...PHP:データベース接続の資格情報を保護する

$user = 'user';// not actual user, not root either 
$pass = 'pass';// not actual password 
$server = 'localhost'; 
$database = mysql_connect($server,$user,$pass,true|false); 

を誰もが、これらは私が話している資格情報です同じページにあることを確認しますデータベース(私は塩と唐辛子でハッシュした明確化のために)。

私は遠く離れて、明らかにサーバがデータベースに接続して訪問者のためにコンテンツを取得する必要があるため、完全に安全なセキュリティを100%保証できると思うものは読んでいません。私が間違っている場合は、これがどうなるか聞いてみたいと思います。

ハッカーがルートアクセス権を持っていると仮定しましょう(または、PHPコードへのアクセスを暗示していない場合は、すべてのPHPソースコードにアクセスできます)。等のデータベース。 PHPソースにアクセスする必要がある場合には、それらを防ぐことができなければ、可能な限り遅くしたいと考えています。私は各サイト/データベース接続パスワードを別々のファイルに保存することができます(私はマルチドメインサポートの仕上げから数週間ですが)public_html(明らかに)の内部ではなく、各サイトのパスワードを保持することができます。私はシリアライズとアンシリアライズを使用して、特定の変数を保存して、データベースが共有ホスティングで利用できなくなったときのフォールトトレランスを確保します(サイトAがサイトBのように見えなくなり、その逆も行わないようにします)。 (私のデータベースのエラーログは、SQLサービスが再び利用可能になったときに書き込まれ、これらの「離れた」エラーをキャッチします)。 1つのハッシュにパスワードを格納し、PHPでデータベースに接続するためにそれらをアンハッシュする方法を決定していますが、これについてのいくつかの意見もありたいと思います。

データベースの観点から(例えば、SELECT、INSERT、DELETE、UPDATEなどにユーザーを制限し、DROPとTRUNCATEを許可しないなど)、私の主な関心事は、最終的にはMySQLからPostgreSQLに移行するつもりです(これについて言及する方が良いかもしれませんが、これは関連するかもしれません)。私は現在、phpMyAdminとcPanelを使用しています。phpMyAdminは、接続されたユーザーがサイトのデータベースユーザー名と同じでないことを示しています。そのため、そのユーザーに対して特定のコマンド(例としてDROPとTRUNCATEを使用します)私は何らかの理由で間違っていますか?

接続資格情報が受け入れられる場所のコンテキストを設定する方法はありますか?明確にするために、ソースコードにアクセスできるハッカーは正当なユーザーと同じ方法でサイトにアクセスしません。

システムベースの暗号化が私の頭を越えるもう一つのアイデアは、システムがApacheを介してファイルを読み書きすることができるほぼ普遍的な(ほぼすべてのLAMP Webホスト設定のような)Webホスティング手法ですハッカーが迂回する方法を決定しなければならない新しい層を導入するだろうか?

私はもちろん、各ユーザーに異なるパスワードを使用しています。

私は現在、共有ホスティングを行っていますが、私のセットアップは最終的に専用ホスティングにまで拡大する予定です。

私のセキュリティコンセプトの考え方と、データベース接続資格情報をより安全にするために他にどのようなコンセプトを試すことができますか?

明確化:私が追求できるアイデアを探しています。いずれかの提案に不一致がある場合は、明確な説明を求めて、与えられたアプローチを議論する代わりにあなたの懸念を説明してください。ありがとう!

+0

これは建設的な質問ではなく、SOに適合しません。特定の質問を投稿してください。これは議論と議論につながります。 – Jakub

+0

私は、データベースの資格情報を格納するセキュリティの強化が建設的ではないことに気付きません。私はアイデアのために議論するつもりはないが、私はその明確化を私の質問に追加する。 – John

答えて

5

システムへのルートアクセス権を既に持っている侵入者を減速させようとしても、少ししか得られません。信任状を隠してしまったとしても、すでにシステムにアクセスすることができ、コードを変更して何でもできるようにするなど、何百万もの方法で大混乱を招く可能性があります。

あなたの最善の策は、バディーがあなたの外側の防御に浸透するのを防ぐことに集中することです。残りの部分について心配してください。

データベースのユーザーアカウントを特定の権限のサブセットに制限することは、アーキテクチャが許可している場合には絶対に悪いことではありません。

+0

私は間違いなくそれに応じて特権を調整します、それは他の誰かから最初に良いアイデアだったと聞きたかったです。私はウェブ開発者であり、私は実際にサーバーを維持していないことを覚えておいてください。 – John

3

code_burgarによれば、あなたのボックスがrootになったら、それは遅すぎます。つまり、私はしばらくしていたプロジェクトにセキュリティメッシュを追加実装する必要がありました。暗号化されたパーティションに設定ファイルを保存して、マシンに直接アクセスできる人がドライブを別のPCに接続してパスワードを取得できないようにするソリューションです。もちろん、これはファイルシステムのアクセス許可に加えて、人々がOS自体の中からファイルを読むことができないためです。

あなたはセキュリティ上のが本当に被害妄想している場合、養育価値が別の詳細:

$user = 'user';// not actual user, not root either 
$pass = 'pass';// not actual password 
$server = 'localhost'; 
$database = mysql_connect($server,$user,$pass,true|false); 

unset($user, $pass, $server); // Flush from memory. 

あなたは、彼らがvar_dumpedまたはメモリから検索することができません確実に、使用後の重要な変数をunsetすることができます。

幸運にも助けになることを望みます。

3

レイヤーでセキュリティに近づきたい。はい、攻撃者がルートアクセス権を持っていれば、あなたは非常に悪い場所にいますが、それが低いレベルの侵入から身を守るべきではありません。これらの推奨事項のほとんどは、共有ホスティングでは難しいかもしれません...

あなたがまともなホスティングプロバイダ、最新バージョンのLAMPを使用していると仮定すると、あなたが非常に有利なターゲット、それはあなたの最大の心配ではない。

サーバーとインフラストラクチャを適切に強化し、正しく構成されていることを確認します。必要のないサービスをオフにする必要があります。 FTPサーバーが稼動している場合、パスワードを強制的に入力することはできません。

まず、アプリケーションコードに脆弱性がないことを確認してください。強力なパスワードポリシーを持っている。ほとんどの「ハック」は、愚かな間違い(SQLインジェクションなど)や弱いパスワード(「admin/admin」の誰か)の結果である「ルート」を持つまで、数ヶ月間あなたのサーバーを悩ます邪悪な天才の結果ではありません。 。

次に、ウェブサーバーが "root"レベルではなく侵害されている場合、攻撃者が任意のSQLスクリプトを実行するのを防ぐことができます。これは可能な限り新しいPHPファイルをアップロードすることができないため、Webサーバーのアクセス権を「読み込みと実行」に制限することを意味します。これは、CPanelやphpMyAdminなどのものを削除することも意味します。プロダクションサーバを侵害して、それらのアプリを侵害し、あなたのパスワードを盗んでしまうかもしれません。

データベースのアクセス許可の設定方法を検討することは間違いありませんが、これは難しいことではありますが、さらにセキュリティを強化することはできません。少なくとも、各クライアント用の「Webユーザー」を作成し、そのユーザーに自分のデータベースで「挿入、更新、削除」のみを許可します。

0

私はrootのディレクトリにdbと言うディレクトリを作成し、クラス内のすべてのデータベース接続変数とアクセスメソッドを定義します。DBConnection.phpあなたのウェブサイトはあなたですpublic_htmlディレクトリにファイルを保存すると、接続して、すべてのデータベース操作を行うには、このディレクトリの下のphpファイルを作成し、このファイルを使用してアクセスすることができない「www.example.com/dbを次の文

require('../db/DBConnection.php'); 

を使用してDBConnection.phpファイルをインクルード/DBConnection.php '

あなたのウェブサイトでこれを試すことができます。

関連する問題