pg(node-postgres)是不是自动清理数据
Posted
技术标签:
【中文标题】pg(node-postgres)是不是自动清理数据【英文标题】:Does pg (node-postgres) automatically sanitize datapg(node-postgres)是否自动清理数据 【发布时间】:2017-05-18 06:11:31 【问题描述】:我将node-postgres
用于生产应用程序,我想知道是否有什么我应该关注的? node-postgres
会自动清理数据吗?
我在 github 页面上找不到任何关于它的信息:https://github.com/brianc/node-postgres
【问题讨论】:
【参考方案1】:绝对! node-postgres 中的参数化查询支持是一流的。所有转义都由 postgresql 服务器完成,确保跨方言、编码等的正确行为......例如,这不会注入 sql:
client.query("INSERT INTO user(name) VALUES($1)", ["'; DROP TABLE user;"], function (err, result) // ... );
这是来自他们的documentation。
【讨论】:
【参考方案2】:这基本上取决于您如何执行@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:无法添加`【参考方案3】:
这取决于您如何执行查询:
通过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'
在这里github.com/brianc/node-postgres/wiki/FAQ
@VincentBuscarello 当查询作为name, text, values
传递到查询方法时,查询以Prepared Statement 执行。以上是关于pg(node-postgres)是不是自动清理数据的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 node-postgres 将多行正确插入 PG?