pg(node-postgres)是否自动清理数据
Does pg (node-postgres) automatically sanitize data
我正在将 node-postgres
用于生产应用程序,我想知道是否有什么我应该关注的?数据是否由 node-postgres
自动清理?
我在 github 页面上找不到任何相关信息:https://github.com/brianc/node-postgres
Absolutely! The parameterized query support in node-postgres is first class. All escaping is done by the postgresql server ensuring proper behavior across dialects, encodings, etc... For example, this will not inject sql:
client.query("INSERT INTO user(name) VALUES()", ["'; DROP TABLE user;"], function (err, result) {
// ...
});
这是来自他们的 documentation。
这取决于您如何执行查询:
通过 Prepared Statements
的格式化由服务器执行,这反过来会从任何 SQL 注入中清除您的查询。但它还有其他限制,比如您不能一次执行多个查询,并且您不能在需要时提供经过清理的实体名称。
客户端查询格式化,就像 pg-promise 实现的那样,净化值,并提供格式化实体名称和多个查询的灵活性。
这基本上取决于您如何按照@vitaly-t 所述执行查询
假设你将在一个字符串中定义查询并执行如下:
var query = `SELECT * FROM table where username='${username}' and password='${password}`;
pool.query(query, (error, results) => {
});
这种情况下如果我要传递用户名=''or 1=1; -- and password=''或1=1; --
然后它将 return 来自 table 的所有记录(意味着 SQL 注入工作)
但是如果我执行下面的查询
pool.query('SELECT * FROM table where username= and password=', [username, password], (error, results) => {
});
那么 SQL 注入将永远不会起作用,因为 pg 会清理数据。
所以这取决于您如何执行查询。
我正在将 node-postgres
用于生产应用程序,我想知道是否有什么我应该关注的?数据是否由 node-postgres
自动清理?
我在 github 页面上找不到任何相关信息:https://github.com/brianc/node-postgres
Absolutely! The parameterized query support in node-postgres is first class. All escaping is done by the postgresql server ensuring proper behavior across dialects, encodings, etc... For example, this will not inject sql:
client.query("INSERT INTO user(name) VALUES()", ["'; DROP TABLE user;"], function (err, result) { // ... });
这是来自他们的 documentation。
这取决于您如何执行查询:
通过 Prepared Statements
的格式化由服务器执行,这反过来会从任何 SQL 注入中清除您的查询。但它还有其他限制,比如您不能一次执行多个查询,并且您不能在需要时提供经过清理的实体名称。
客户端查询格式化,就像 pg-promise 实现的那样,净化值,并提供格式化实体名称和多个查询的灵活性。
这基本上取决于您如何按照@vitaly-t 所述执行查询
假设你将在一个字符串中定义查询并执行如下:
var query = `SELECT * FROM table where username='${username}' and password='${password}`;
pool.query(query, (error, results) => {
});
这种情况下如果我要传递用户名=''or 1=1; -- and password=''或1=1; --
然后它将 return 来自 table 的所有记录(意味着 SQL 注入工作)
但是如果我执行下面的查询
pool.query('SELECT * FROM table where username= and password=', [username, password], (error, results) => {
});
那么 SQL 注入将永远不会起作用,因为 pg 会清理数据。
所以这取决于您如何执行查询。