如何在Postgres/node中正确转义原始SQL查询(plainto_tsquery)

Tyl*_*ler 3 security postgresql sql-injection node.js

我正在编写一个原始的SQL查询来在我的节点后端实现Postgres全文搜索.我查看了官方文档,其中说明:

plainto_tsquery将无格式文本querytext转换为tsquery.对于to_tsvector,文本被解析和规范化,然后在幸存的单词之间插入&(AND)布尔运算符.

但我对所有不同的SQL注入技术都不熟悉,无法确定以下内容是否会被正确转义:

'SELECT * FROM "Products" WHERE "catalog_ts_vector" @@ plainto_tsquery(\'english\', ' + search_term + ')'
Run Code Online (Sandbox Code Playgroud)

用户将能够search_term通过URI 输入他们想要的任何内容.

我是否需要进一步转义/操纵,或者此功能是否完全融入plainto_tsquery()其他Postgres保护措施?

编辑

作为旁注,我打算删除大多数非字母数字字符(包括括号).replace(/[^\w-_ .\&]|\(\)/g, ' '); 这应该走很长的路,但我仍然很好奇,如果这是必要的.

ale*_*ods 10

很可能你正在使用pg模块作为PostgreSQL客户端node.js.在这种情况下,您不必担心SQL注入,pg为您阻止它.只是不使用字符串连接来创建查询,使用参数化查询(或预准备语句):

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
});
Run Code Online (Sandbox Code Playgroud)

另请参阅pg wiki和PostgreSQL PREPARE语句的Prepared Statment部分.

UPD怎么样sequelize- 它pg默认使用模块,但你可以在dialectModulePathconfig参数中指定你更喜欢的pg客户端(见这里).您也可以使用参数化查询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
})
Run Code Online (Sandbox Code Playgroud)

Product你的续集产品型号在哪里?