有没有办法在 TypeORM 的选择部分绑定参数?

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)

也许有人知道在我的技术堆栈中实现这种搜索的更好方法?

Mat*_*ers 6

我需要一个类似的解决方案,但是你的解决方案不会为我削减它。如果您想更改 select 中的参数,您应该查看setParameter,这是第二个参数addWhere在内部执行的操作。

https://github.com/typeorm/typeorm/blob/master/docs/select-query-builder.md#using-parameters-to-escape-data

所以在你的情况下你可以跑

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)


Yev*_*nii 3

这个问题的决定是在接下来的方式中使用相同的绑定键whereselect语句。

applySearch(builder: SelectQueryBuilder<any>, needle: string) {
    if (needle) {
      builder.addSelect(`similarity(title, :needle)`);
      builder.andWhere('title % :needle', { needle });
    }
  }
Run Code Online (Sandbox Code Playgroud)