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

标签 node.js postgresql security sql-injection

我正在编写原始 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/

相关文章:

node.js - Tibco EMS 协议(protocol)

node.js - Nodejs 请求模块失败并以验证码结束

javascript - 如何在React组件中使用渲染的json数据

postgresql - 从转储文件创建的数据库的 Postgres 权限

c# - 保护 JSON 和 ASP.NET MVC2

javascript - 不安全的 JavaScript 尝试使用 URL 访问框架(同一域!)

node.js - POST 请求正文为 Null 或空

Postgresql - 如何安全地重命名表

java - 如何使用参数在触发器中设置模式?

ios - 排毒 - 请求被服务委托(delegate) (PBProcessManager) 拒绝,原因为 : Security