sql >> データベース >  >> RDS >> PostgreSQL

Psycopg2はプレースホルダーを使用してテーブルに挿入します

    Python文字列フォーマットを使用していますが、これは非常に悪いアイデア(TM)です。 SQLインジェクションを考えてください。それを行う正しい方法は、束縛変数を使用することです:

    cur.execute('INSERT INTO %s (day, elapsed_time, net_time, length, average_speed, geometry) VALUES (%s, %s, %s, %s, %s, %s)', (escaped_name, day, time_length, time_length_net, length_km, avg_speed, myLine_ppy))
    

    ここで、パラメーターのタプルはexecute()の2番目の引数として指定されます 。また、値をエスケープする必要はありません。psycopg2がエスケープを行います。この特定のケースでは、変数(escaped_nameでテーブル名を渡さないこともお勧めします )ただし、クエリ文字列に埋め込むには、psycopg2はテーブル名と列名を引用する方法を認識せず、値のみを認識します。

    psycopg2のドキュメントを参照してください:

    https://www.psycopg.org/docs/usage.html#passing-parameters-to-sql-queries

    プログラムでSQLステートメントを生成する場合、通常の方法は、ステートメントにPython形式を使用し、引数に変数バインディングを使用することです。たとえば、escaped_nameにテーブル名がある場合 あなたができること:

    query = "INSERT INTO %s (col1, ...) VALUES (%%s, ...)" % escaped_name
    curs.execute(query, args_tuple)
    

    明らかに、クエリでプレースホルダーを使用するには、%を引用符で囲む必要があります 最初の形式でバインドされた引数を導入します。

    これは次の場合にのみ安全であることに注意してください escaped_name は外部入力(テーブルベース名やカウンターなど)を無視してコードによって生成されますが、ユーザーから提供されたデータを使用するとSQLインジェクションのリスクがあります。



    1. ClusterControl CMON HA for Distributed Database High Availability-パート2(GUIアクセスセットアップ)

    2. ORACLEとTRIGGERS(挿入、更新、削除)

    3. Python mysqlクエリから%をエスケープするにはどうすればよいですか?

    4. Oracle:サブクエリ内の複数の結果を1つのコンマ区切り値に結合します