web-dev-qa-db-ja.com

pg(node-postgres)は自動的にデータをサニタイズしますか

本番アプリケーションにnode-postgresを使用していますが、何か気になることがあるかどうか疑問に思っていますか?データはnode-postgresによって自動的にサニタイズされますか?

Githubページでそれについて何も見つかりませんでした: https://github.com/brianc/node-postgres

13
Luke Schlangen

クエリの実行方法によって異なります。

Prepared Statementsによるフォーマットはサーバーによって実行され、サーバーはSQLインジェクションからのクエリをサニタイズします。ただし、一度に複数のクエリを実行したり、必要に応じてサニタイズされたエンティティ名を指定したりすることはできないなど、他の制限もあります。

通常のクエリのフォーマットは値に対してサニタイズされ、エンティティ名と複数のクエリのフォーマットに柔軟性を提供しますが、SQLインジェクションに対する保護は提供しません。

2
vitaly-t

絶対に! node-postgresでのパラメーター化されたクエリのサポートは、ファーストクラスです。すべてのエスケープはpostgresqlサーバーによって行われ、方言やエンコーディングなどで適切な動作が保証されます。たとえば、これはSQLを挿入しません。

client.query("INSERT INTO user(name) VALUES($1)", ["'; DROP TABLE user;"], function (err, result) {
  // ...
});

これは documentation によるものです。

18
Tuan Anh Tran

基本的には、@ vitaly-tで説明されているように、クエリを実行する方法に依存します

文字列でクエリを定義し、次のように実行するとします

var query = `SELECT * FROM table where username=${username} and password=${password}`;

pool.query(query, (error, results) => {
 });

username= ''または1 = 1;-およびpassword= '' or 1 = 1;-テーブルからすべてのレコードを取得するよりも(SQLインジェクションが機能することを意味します)

Butクエリを実行する場合は、次のようになります

pool.query('SELECT * FROM table where username=$1 and password=$2', [username, password], (error, results) => {
});

pgはデータをサニタイズするため、SQLインジェクションは機能しません。クエリの実行方法によって異なります。

4
Ankit