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你的续集产品型号在哪里?
| 归档时间: |
|
| 查看次数: |
7673 次 |
| 最近记录: |