我正在使用node-postgres
开发一款生产应用,我想知道是否有需要注意的问题?node-postgres
是否会自动对数据进行过滤?
我在https://github.com/brianc/node-postgres的页面上没找到相关信息。
我正在使用node-postgres
开发一款生产应用,我想知道是否有需要注意的问题?node-postgres
是否会自动对数据进行过滤?
我在https://github.com/brianc/node-postgres的页面上没找到相关信息。
当然可以!node-postgres中的参数化查询支持是一流的。所有转义都由postgresql服务器完成,确保在不同方言、编码等情况下行为正确。例如,这不会注入sql:
client.query("INSERT INTO user(name) VALUES($1)", ["'; DROP TABLE user;"], function (err, result) {
// ...
});
这是从他们的文档中提取的。它基本上取决于您执行查询的方式,就像 @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注入就永远不会起作用。
因此,这取决于您如何执行查询。
这取决于您如何执行查询:
通过 Prepared Statements
格式化的方式是由服务器执行的,服务器会从任何SQL注入中对您的查询进行净化。但它也有其他限制,比如您不能一次执行多个查询,并且当需要时,您不能提供净化后的实体名称。
客户端查询格式化,比如 pg-promise 实现的方式,会清理值,还可以灵活地格式化实体名称和多个查询。
.query
,它是否可以被视为预处理语句?这方面的文档在哪里? - Vincent Buscarelloclient.query(queryText, ['841l14yah', 'test@te.st'```
- Vincent Buscarello
query = "SELECT * FROM table where username='${username}' and password='${password}'"
吧?PS:无法添加`。 - Matteo