2012-02-22 20 views
1

私は現在、php/PostgreSQL/JQueryプロジェクトに取り組んでいます。これらのドメインでは絶対初心者です。 phpでは、私のデータベースに接続するために、私が見つけた最良の方法は、これを必要とするすべてのPHPスクリプトにphp スクリプトとユーザとパスワードを含めることでした。 include('../scripts/pgconnect.php');PostgreSQLデータベース接続を保護する

pgconnect.phpで

$conn_string = "dbname=mydb user=myuser password=mypass";

$db = pg_connect($conn_string);

if(!$db){ die("Connection à la base impossible -> " . pg_errormessage($db));}

私はあなたのすべてのセキュリティ専門家は、この時に笑うだろうと確信しているので、あなたが言うことができます私はユーザーを守り、詮索する目から脱出する最良の方法は何ですか? スタックオーバーフローでenv変数を使用するためのアドバイスが見つかりましたが、本当に安全ではありません。

+0

回答の左側にあるVをクリックすると、1つの(!)回答を受け入れることができます。それは人々にあなたの将来の質問に答えるための動機付けを保つでしょう。だから、最善の答えを選んでください。 –

答えて

4

PHPはサーバーサイドの言語です。つまり、リクエストされたページがクライアントに返されると、すべてのPHPコードが解析され、「削除」されます。あなたがあなたのファイルを見ることができる唯一の人であれば、恐れはありません。

(env)変数に格納するかどうかは、1つの違いはありません。このコードで何も間違っては絶対にありません

;)


編集:

あなたはSQLクエリはしかし、あなたは注意する必要があり、実行

。多くの場合、ユーザ入力(URLまたはPOSTデータ)を使用して、クエリ内の特定の値を設定します。例えば:

$sql = 'SELECT * FROM `table` WHERE `id`=' . $_GET['id']; 

$_GET['id']変数は、URL(index.php?id=4)に設定されています。

値が4に変更された場合、データベースですべての処理を行うことができます。これはSQL injectionと呼ばれます。これは真にデータベースを使用するWebアプリケーションの最大の脅威です。

複数の修正があります。

  • が入力(入力はSQL構文が含まれていないことを確認してください)
  • 今すぐ文

を準備サニタイズ、私は、PostgreSQLに慣れていないんだけど、どうやらPHPモジュールを持っています準備されたステートメントを送る能力。これにより、未知の値を持つクエリを疑問符として送信し、その後に値を送信することができます。

$sql = 'SELECT * FROM `table` WHERE `id`=?'; 
// send prepared statement 

$value = $_GET['id']; 
// send the value 

このようにして、データベースは値がクエリではないことを知ることができます。

私が言ったように、私はPostgreSQLに精通していませんが、完全にあなたを導くチュートリアルがいくつかあります。


別の編集:

私はいい人だから、私はそれを行う方法を発見!関数pg_prepare()pg_execute()を使用する必要があります。

// This is a name to allow the database to identify the prepared statement 
$queryname = 'my_query'; 

// Setting up our query with "empty" values 
$sql = "SELECT * FROM `table` WHERE `column`='$1' AND `column`='$2'"; 

// Setting our values to send afterwards 
$values = array(
    $_GET['first_value'], // The first value that will replace $1 
    $_GET['second_value'] // The second value that will replace $2 
); 

$result = pg_prepare($connection, $queryname, $sql); // Send the query to the database 
$result = pg_execute($connection, $queryname, array($value)); // Send the values 

最終編集(私は誓う):このようにあなたがのexternファイル内のコンフィギュレーション変数を置くことを決定した場合

、ファイルがで終わっていることを確認し、configuration.phpを言うことができます.php拡張子。別の拡張機能を使用すると、人々はそれを見つけてプレーンテキストで見ることができます。 PHPの拡張機能が使用されている場合、私が言ったように、PHPは解析され、削除されるため、何も見えません。

+3

申し訳ありませんが、これはひどいアドバイスです。データベースのパスワードは、決してプレーンテキストで保存しないでください。特に、PHPファイルには保存しないでください。 – AviD

+1

@AviD PHPはクライアントに送信される前に解析されますが、パスワードを見ることはできません。誰かがサーバー上のファイルに直接アクセスしない限り、脅威はありません。なぜ世界をリードするCMSがPHPファイルのデータベースパスワードをプレーンテキストで保存すると思いますか?あなたの言うような大きな問題なら、何をお勧めしますか?たとえあなたがそれを暗号化しても、それを解読する必要があります。ハッカーがサーバーファイルにアクセスすると、解読アルゴリズムも検索できます。他の拡張子を使用する場合、テキストは解析されず、さらに悪いプレーンテキストで表示されます。 –

+4

もちろん、それはクライアントに送られません。エラーがない限り。またはいくつかの脆弱性。または、ファイルへの内部アクセス。または...なぜ世界をリードするCMSがプレーンテキストのPHPファイルでファイルを保存するのでしょうか?私は見当もつかない。明らかにどちらもしません。残りのコメントは無意味で、暗号化、保護、およびセキュリティの完全な誤解が表示されます。私はあなた自身がプロの開発者と呼ぶ前に、これらのテーマについて少し宿題をすることをお勧めします。 – AviD

1

db認証情報を格納するために環境変数を使用しています。すなわち、データベースのホスト/ユーザー/パスワードは、Apache構成のSetEnvコマンドにあり、$_SERVERに表示されます。

なぜですか?

  1. 開発環境と運用環境には異なる値が必要なため、アプリケーションに何らかの環境設定を読み込ませる必要があります。
  2. アプリケーションコードは、簡単に閲覧可能なソースコードリポジトリにあります。認証秘密を埋め込むことで、それらを広く利用できるようにします。

環境変数は唯一の解決策ではありません。たとえば、何らかの設定オブジェクトを設定するファイルを含めても機能します。しかし、ほとんどの人は、全く異なるスケジュールで変更される、これらの設定を使用するコードとは別に、単一の変更可能なポイントで構成設定(および設定のみ)を持つシステムを展開しているようです。

+0

アドバイスいただきありがとうございます。私は注意深くpg_prepareのドキュメントを読むでしょう(それについて知りませんでした)ユーザ/パス情報の変数をenvに再度考えてください。 –

関連する問題