2

職場で使用しているデータベース ライブラリを更新して、パラメーター化されたクエリを使用できるようにしようとしています。これにより、SQL インジェクションについてあまり詳しくない同僚が入力をエスケープすることを忘れずに、代わりにパラメーターの配列を渡すだけで済むようになります (I' m を使用pg_query_params)。

しかし、問題が発生しています。データベース ライブラリの要件の 1 つは、実行される各クエリをログに記録することです。パラメーターが入力された後、パラメーター化されたクエリのテキストを取得する方法がわかりません。これを行う方法はありますか (パラメーター化されたクエリ用に独自の関数をロールすることは別として、私は推測します)?

つまり、次のようなパラメータ化されたクエリを実行するとき

pg_query_params('SELECT id FROM table WHERE foo = $1', array('bar'));

のようなものを取得したい

SELECT id FROM table WHERE foo = 'bar'
4

2 に答える 2

2

PostgreSQL拡張プロトコル ( で使用されるpg_query_params) は、パラメータをクエリから分離します。

PostgreSQLクエリは最終的にサーバー側でのみ構築されます。 の機能のみを使用してクライアント側でクエリを構築する方法はありません。

を使用してパラメーターを送信する前に、提供されたパラメーターの値を置き換え、クエリをログに記録できますpreg_replace

アップデート:

サーバー側でクエリをファイルまたは(バインドされたパラメーターを含む) に記録するPostgreSQLロギングを有効にしてから、このファイルを定期的にテーブルにロードすることができます。syslogPostgreSQL

于 2010-01-25T15:00:43.607 に答える
0

ソース コード内のすべての pg_query_params() を独自のラッパー関数に置き換えることができない限り (可能であれば、PHP の自動付加機能を使用してラッパーの宣言を含めることをお勧めします)、実際に行うことしかできません。これはデータベース レベルです。

C.

于 2010-01-25T19:17:18.023 に答える