web-dev-qa-db-ja.com

SQLインジェクションからのPostgres保護

Postgresは動的なコード実行を許可し、SQLインジェクションに対して脆弱になる可能性があります。

これに対してどのような保護対策がありますか?

6
LINUX G33NYUS

SQLを使用する他のデータベースと同じように、以下を使用します( OWASPチートシートから)

  • オプション#1:準備済みステートメントの使用(パラメーター化されたクエリ)
  • オプション#2:ストアドプロシージャの使用
  • オプション#3:ユーザー提供の入力をすべてエスケープする
  • また実施:最小特権
  • また実行:ホワイトリストの入力検証
9
Rory Alsop

SQLインジェクションはアプリケーションの脅威であり、データベースの脅威ではありません。最後に、すべてのリレーショナルデータベースは、文字列として渡されるSQLを実行します。また、SQL文字列が有害でないことを確認するのは、アプリケーション開発者の責任です。

SQLインジェクションは、アプリケーションが有害なSQL文字列をデータベースに送信する方法であり、アプリケーション開発者にとっては最初のビューでは明白ではない方法で送信されます。例:アプリケーションに次のようなコードが含まれている場合

string sql_stmt = "select a from t where k = '" + textfield.text + "'"

どこ textfield.textはアプリケーションでユーザーが入力したテキストであり、データベースにsqlを送信すると、賢いユーザーが入力できます

';drop table t; --

文字列になるテキストフィールドに

select a from t where k = '';drop table t; --'

データベースに送信され、テーブルtが削除されます。

しかし、これはデータベースではなく、アプリケーション開発者の責任です。データベースは、送信されたSQLを実行するだけです。そして最終的には、テーブルを削除する可能性がなければなりません。

@RoryAlsopが彼の回答ですでに述べたように、Postgresは他の多くのデータベースと同様に、安全なコード(権限、準備されたステートメントなど)の開発を容易にするためにアプリケーション開発者にいくつかのサポートを提供しますが、最終的にはアプリケーション開発者の責任ですこれらの方法または他の方法を使用して、SQLインジェクションからapplicationを保護します。これが発生する可能性があるためです。データベースはこれが脅威であるレベルではなく、障害の影響が発生する場所のみです。

7
FrankPl