pg(node-postgres)会自动清洗数据吗?

22

我正在使用node-postgres开发一款生产应用,我想知道是否有需要注意的问题?node-postgres是否会自动对数据进行过滤?

我在https://github.com/brianc/node-postgres的页面上没找到相关信息。

3个回答

35

当然可以!node-postgres中的参数化查询支持是一流的。所有转义都由postgresql服务器完成,确保在不同方言、编码等情况下行为正确。例如,这不会注入sql:

client.query("INSERT INTO user(name) VALUES($1)", ["'; DROP TABLE user;"], function (err, result) {
  // ...
});
这是从他们的文档中提取的。

19

它基本上取决于您执行查询的方式,就像 @vitaly-t 描述的那样。

假设您将查询定义为一个字符串并按以下方式执行:

var query = `SELECT * FROM table where username='${username}' and password='${password}`;
        
pool.query(query, (error, results) => {
});

如果我将username=' 'or 1=1; --password=' 'or 1=1; --通过该方法传递,那么它将返回表中的所有记录(也就是SQL注入攻击成功了)。

但是如果我执行以下查询:

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

如果pg对数据进行了清洗,那么SQL注入就永远不会起作用。

因此,这取决于您如何执行查询。


2
应该这样写,query = "SELECT * FROM table where username='${username}' and password='${password}'"吧?PS:无法添加`。 - Matteo

7

这取决于您如何执行查询:

通过 Prepared Statements 格式化的方式是由服务器执行的,服务器会从任何SQL注入中对您的查询进行净化。但它也有其他限制,比如您不能一次执行多个查询,并且当需要时,您不能提供净化后的实体名称。

客户端查询格式化,比如 pg-promise 实现的方式,会清理值,还可以灵活地格式化实体名称和多个查询。


愚蠢的问题 - 如果格式化字符串查询被传递给.query,它是否可以被视为预处理语句?这方面的文档在哪里? - Vincent Buscarello
还是必须使用这种语法呢?client.query(queryText, ['841l14yah', 'test@te.st'``` - Vincent Buscarello
请在此处获取有关node-postgres的FAQ内容:https://github.com/brianc/node-postgres/wiki/FAQ - Vincent Buscarello
1
当查询以{name, text, values}的形式传递到查询方法中时,它将作为Prepared Statement执行。@VincentBuscarello - vitaly-t

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接