pg(node-postgres)是否自动清理数据

Luk*_*gen 10 node.js pg node-postgres

我正在使用node-postgres生产应用程序,我想知道是否有任何我应该关注的事项?数据是否自动消毒node-postgres

我在github页面上找不到任何关于它的信息:https://github.com/brianc/node-postgres

Tua*_*ran 19

绝对!node-postgres中的参数化查询支持是第一类.所有转义都是由postgresql服务器完成的,确保方言,编码等方面的正确行为......例如,这不会注入sql:

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

这是他们的文档.

  • 谢谢@Tuan。(这应该是公认的答案) (2认同)

Ank*_*kit 15

它基本上取决于您如何按照@vitaly-t 的描述执行查询

假设您将在字符串中定义查询并执行如下:

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

在这种情况下,如果我会通过username = ' ' 或 1=1; --密码= ' ' 或 1=1; ——

然后它将返回表中的所有记录(意味着 SQL 注入有效)

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

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

那么 SQL 注入将永远不会起作用,因为 pg 会清理数据。

所以这取决于你如何执行查询。

  • 难道不应该是 `query = "SELECT * FROM table where username='${username}' and password='${password}'"` 吗?PS:无法添加` (2认同)

vit*_*y-t 6

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

格式化通过Prepared Statements由服务器执行,它反过来从任何 SQL 注入清理您的查询。但它还有其他限制,例如您一次不能执行多个查询,并且您不能在需要时提供经过消毒的实体名称。

客户端查询格式,如pg-promise实现的格式,可以清理值,并在格式化实体名称和多个查询方面提供灵活性。