我正在尝试在使用 TypeScript 和 TypeOrm 编写的项目中使用 PostgreSQL 中的 pg_trgm
模块实现搜索。
对我有用的 SQL 如下所示:
SELECT t, similarity(t, 'word') AS sml
FROM test_trgm
WHERE t % 'word'
ORDER BY sml DESC, t;
但是当我开始将它集成到我的构建器中时,我意识到我无法保护 select 语句免受 SQL 注入(inject),因为 TypeOrm 不提供在任何选择方法中绑定(bind)参数(例如 SelectQueryBuilder::addSelect
, SelectQueryBuilder::select
).
我的易受攻击方法示例:
...
applySearch(builder: SelectQueryBuilder<any>, needle: string) {
if (needle) {
builder.addSelect(`similarity(title, ${needle})`);
builder.andWhere('title % :needle', { needle });
}
}
...
也许有人知道在我的技术堆栈中实现这种搜索的更好方法?
最佳答案
我需要一个类似的解决方案,但是您的解决方案不适合我。如果您想更改选择中的参数,您应该查看 setParameter
,这是 addWhere
的第二个参数在内部执行的操作。
所以在你的情况下你可以跑
applySearch(builder: SelectQueryBuilder<any>, needle: string) {
if (needle) {
builder.addSelect(`similarity(title, :title)`);
builder.andWhere('title % :needle', { needle });
builder.setParameter('title', needle);
}
}
关于postgresql - 有没有办法在 TypeORM 的选择部分绑定(bind)参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57553534/