2016-09-14 5 views
0

this質問によると、私は、'F'という識別子を使用してプロキシとして関数呼び出しを見つけることはできません。フロントエンドとバックエンドの間のプロキシとして関数呼び出しを認識

私はpostgreSQLがextended query protocolを使用して、関数などのパラメトリックステートメントを送信することをもっと研究しました。私はあまりにも拡張問い合わせプロトコルを使用しますprepared-statementsを実行知っ

を(私が間違っているなら、私を修正)(と私は、このプロトコルを使用して複数のステートメントがあるはずだと思う)

は、だから私は、これはすべきではないと思います関数呼び出しをプロキシとして認識する方法。他の方法はありますか?まったく可能ですか?それとも、私は完全に失われ、すべてを誤解していますか?関数呼び出しを認識することによって、私は、関数呼び出しを認識し、(クライアントとサーバ間の)フロントエンド、バックエンド接続では、第三者として渡されたパラメータと関数名を調査する必要がある意味仕方によって

答えて

2

PostgreSQLはを使用していますパラメータ付きのステートメントの拡張クエリプロトコルですが、これらのパラメータは関数パラメータと必ずしも同じではありません。

あなたはこのような関数呼び出しを送信する場合、the C APIを用いた例を使用するには:

res = PQexec(conn, "SELECT myfun(42)"); 

それは'Q'クエリ)識別子を持つパケットで送信されます。

あなたはこのようにそれを送信する場合:

const Oid types[1] = { INT4OID }; 
const char * const vals[1] = { "42" }; 

res = PQexecParams(conn, "SELECT myfun($1)", 1, types, vals, NULL, NULL, 0); 
クエリが 'P'解析)の識別子と、次の 'B'バインド)に送られると、パラメータを持つパケットで送信されます

パケット。

しかし、それは、関数呼び出しとは何の関係もありません同じことが、このようなクエリのために発生します:

SELECT val FROM mytab WHERE id = $1; 

あなたはあなたの目標は、フロントエンド・バックエンドプロトコルに耳を傾け、すべての関数呼び出しをフィルタリングすることであると言いますパラメータが渡されます。

これは非常に難しい作業です。基本的には、サーバに送信されたSQL文を解析する必要があることを意味します。つまり、PostgreSQLのパーサの少なくとも一部を複製する必要があります。構文解析された文を覚えて、バインドパケットからパラメータを注入する必要があります。それに加えて

、私の心に来て2つの質問:この方法を使用すると、関数の内部発行関数呼び出しをキャッチすることができませんことを

  1. を重要ですか?

  2. どのようにあなたは、このようなケースで渡されたパラメータを決定します:

    SELECT myfun((SELECT val FROM tab WHERE id = 42)); 
    

    またはこの:

    SELECT myfun(CAST(otherfun(42) || '0' AS integer)); 
    

は、たぶん、あなたが望むものを達成するためのより良い方法がハッキングのように、ありますPostgreSQLサーバを起動し、関数が実際に呼び出される場所で情報を抽出します。

+0

ありがとうございます、あなたが言ったこの2つの問題は私の問題でもありましたが、今は単純な呼び出しに焦点を当てます。ハッキングサーバーは、プロキシとして動作する必要があるため、オプションではありません。 – Hamed

+0

postgreSQLはパラメータ付きのステートメントの拡張クエリプロトコルを使用しているので、例えば、準備済みのステートメントと同じ名前と同じパラメータを持つ関数があれば、サーバーは正しいものを選択して実行するようになりますクライアントコール? 'select'または' execute'ステートメントだけを使用していますか? – Hamed

+0

あいまいさはありません。準備された文は、SQL関数['EXECUTE'](https://www.postgresql.org/docs/current/static/sql-execute.html)または[' PQexecPrepared'](https:// www.postgresql.org/docs/current/static/libpq-exec.html#LIBPQ-PQEXECPREPARED)。どちらの場合も、関数名は存在しません。 –

関連する問題