我正在编写原始 SQL 查询以在我的 Node 后端中实现 Postgres 全文搜索。我浏览了 official docs , 哪个州:
plainto_tsquery transforms unformatted text querytext to tsquery. The text is parsed and normalized much as for to_tsvector, then the & (AND) Boolean operator is inserted between surviving words.
但我对所有不同的 SQL 注入(inject)技术都不够熟悉,无法确定以下内容是否会被正确转义:
'SELECT * FROM "Products" WHERE "catalog_ts_vector" @@ plainto_tsquery(\'english\', ' + search_term + ')'
用户将能够通过 URI 输入他们想要的任何 search_term
。
我是否需要进行进一步的转义/操作,或者此功能是否已完全纳入 plainto_tsquery()
和其他 Postgres 安全措施?
编辑
作为旁注,我计划用 .replace(/[^\w-_ .\&]|\(\)/g, ' ' 删除大多数非字母数字字符(包括括号) )
;这应该有很长的路要走,但我仍然很好奇这是否有必要。
最佳答案
您很可能正在使用 pg
模块作为 node.js
的 PostgreSQL 客户端。在这种情况下,您无需担心 sql 注入(inject),pg
会为您阻止它。只是不使用字符串连接来创建查询,使用参数化查询(或 prepared statement ):
var sql = 'SELECT * FROM "Products" WHERE "catalog_ts_vector" @@ plainto_tsquery(\'english\', $1)';
var params = [search_term];
client.query(sql, params, function(err, result) {
// handle error and result here
});
另请参阅 Prepared Statment pg
wiki 和 PostgreSQL 的一部分 PREPARE声明。
UPD sequelize
- 它默认使用 pg
模块,但您可以在 dialectModulePath< 中指定您喜欢的 pg 客户端
配置参数(参见 here)。您也可以在 sequelize
中使用参数化查询。更好的是 - 您可以使用命名参数。所以你的代码将是:
var sql = 'SELECT * FROM "Products" WHERE "catalog_ts_vector" @@ plainto_tsquery(\'english\', :search_term)';
var params = { search_term: search_term }
sequelize.query(sql, Product, null, params).then(function(products) {
// handle your products here
})
Product
是您的续集产品型号。
关于node.js - 如何在 Postgres/node 中正确转义原始 SQL 查询 (plainto_tsquery),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29436565/