Yev*_*nii 1 postgresql typescript typeorm
我正在尝试pg_trgm在用 TypeScript 和 TypeOrm 编写的项目上使用 PostgreSQL 中的模块实现搜索。对我有用的 SQL 如下所示:
SELECT t, similarity(t, 'word') AS sml
FROM test_trgm
WHERE t % 'word'
ORDER BY sml DESC, t;
Run Code Online (Sandbox Code Playgroud)
但是当我开始将它集成到我的构建器中时,我意识到我无法保护 select 语句免受 SQL 注入,因为 TypeOrm 不提供在任何选择方法(例如SelectQueryBuilder::addSelect, SelectQueryBuilder::select)中绑定参数。
我的易受攻击方法的示例:
...
applySearch(builder: SelectQueryBuilder<any>, needle: string) {
if (needle) {
builder.addSelect(`similarity(title, ${needle})`);
builder.andWhere('title % :needle', { needle });
}
}
...
Run Code Online (Sandbox Code Playgroud)
也许有人知道在我的技术堆栈中实现这种搜索的更好方法?
我需要一个类似的解决方案,但是你的解决方案不会为我削减它。如果您想更改 select 中的参数,您应该查看setParameter,这是第二个参数addWhere在内部执行的操作。
所以在你的情况下你可以跑
applySearch(builder: SelectQueryBuilder<any>, needle: string) {
if (needle) {
builder.addSelect(`similarity(title, :title)`);
builder.andWhere('title % :needle', { needle });
builder.setParameter('title', needle);
}
}
Run Code Online (Sandbox Code Playgroud)
这个问题的决定是在接下来的方式中使用相同的绑定键where和select语句。
applySearch(builder: SelectQueryBuilder<any>, needle: string) {
if (needle) {
builder.addSelect(`similarity(title, :needle)`);
builder.andWhere('title % :needle', { needle });
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3420 次 |
| 最近记录: |