有什么方法可以在 TypeORM 的 select 部分绑定参数吗?
Is there any way to bind parameter in select section for TypeORM?
我正在尝试在使用 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 注入,因为 TypeOrm 不提供在任何 select方法(如SelectQueryBuilder::addSelect
、SelectQueryBuilder::select
)。
我的漏洞方法示例:
...
applySearch(builder: SelectQueryBuilder<any>, needle: string) {
if (needle) {
builder.addSelect(`similarity(title, ${needle})`);
builder.andWhere('title % :needle', { needle });
}
}
...
也许有人知道在我的技术栈中实现此搜索的更好方法?
此问题的决定是在 where
和 select
语句中使用相同的绑定密钥以接下来的方式。
applySearch(builder: SelectQueryBuilder<any>, needle: string) {
if (needle) {
builder.addSelect(`similarity(title, :needle)`);
builder.andWhere('title % :needle', { needle });
}
}
我需要一个类似的解决方案,但是你的解决方案不适合我。如果您想更改 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);
}
}
我正在尝试在使用 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 注入,因为 TypeOrm 不提供在任何 select方法(如SelectQueryBuilder::addSelect
、SelectQueryBuilder::select
)。
我的漏洞方法示例:
...
applySearch(builder: SelectQueryBuilder<any>, needle: string) {
if (needle) {
builder.addSelect(`similarity(title, ${needle})`);
builder.andWhere('title % :needle', { needle });
}
}
...
也许有人知道在我的技术栈中实现此搜索的更好方法?
此问题的决定是在 where
和 select
语句中使用相同的绑定密钥以接下来的方式。
applySearch(builder: SelectQueryBuilder<any>, needle: string) {
if (needle) {
builder.addSelect(`similarity(title, :needle)`);
builder.andWhere('title % :needle', { needle });
}
}
我需要一个类似的解决方案,但是你的解决方案不适合我。如果您想更改 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);
}
}