【发布时间】:2017-05-18 06:11:31
【问题描述】:
我将node-postgres 用于生产应用程序,我想知道是否有什么我应该关注的? node-postgres会自动清理数据吗?
我在 github 页面上找不到任何关于它的信息:https://github.com/brianc/node-postgres
【问题讨论】:
标签: node.js pg node-postgres
我将node-postgres 用于生产应用程序,我想知道是否有什么我应该关注的? node-postgres会自动清理数据吗?
我在 github 页面上找不到任何关于它的信息:https://github.com/brianc/node-postgres
【问题讨论】:
标签: node.js pg node-postgres
绝对! node-postgres 中的参数化查询支持是一流的。所有转义都由 postgresql 服务器完成,确保跨方言、编码等的正确行为......例如,这不会注入 sql:
client.query("INSERT INTO user(name) VALUES($1)", ["'; DROP TABLE user;"], function (err, result) { // ... });
这是来自他们的documentation。
【讨论】:
这基本上取决于您如何执行@vitaly-t 描述的查询
假设您将在字符串中定义查询并执行如下:
var query = `SELECT * FROM table where username='${username}' and password='${password}`;
pool.query(query, (error, results) => {
});
这种情况如果我会通过 username=' ' 或 1=1; -- 和 密码=' ' 或 1=1; --
然后它将返回表中的所有记录(意味着 SQL 注入有效)
但是如果我要执行以下查询
pool.query('SELECT * FROM table where username=$1 and password=$2', [username, password], (error, results) => {
});
那么 SQL 注入将永远无法工作,因为 pg 会清理数据。
所以这取决于你如何执行查询。
【讨论】:
query = "SELECT * FROM table where username='${username}' and password='${password}'" 吗? PS:无法添加`
这取决于您如何执行查询:
通过Prepared Statements 格式化是由服务器执行的,这反过来又会清除您的查询,使其免受任何 SQL 注入的影响。但它还有其他限制,例如一次不能执行多个查询,并且不能在需要时提供经过清理的实体名称。
客户端查询格式化,如 pg-promise 实现的格式化,净化值,并提供格式化实体名称和多个查询的灵活性。
【讨论】:
.query,是否可以将其视为准备好的语句?这方面的文档在哪里?
var queryText = 'INSERT INTO users(password_hash, email) VALUES($1, $2) RETURNING id' client.query(queryText, ['841l14yah', 'test@te.st'
{name, text, values} 传递到查询方法时,查询以Prepared Statement 执行。