【问题标题】:Is there any way to bind parameter in select section for TypeORM?有没有办法在 TypeORM 的选择部分绑定参数?
【发布时间】:2020-10-16 16:20:58
【问题描述】:

我正在尝试在使用 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 不提供在任何选择方法中绑定参数(例如SelectQueryBuilder::addSelectSelectQueryBuilder::select )。

我的易受攻击方法示例:

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

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

【问题讨论】:

标签: postgresql typescript typeorm


【解决方案1】:

我需要一个类似的解决方案,但是您的解决方案不适合我。如果您想更改选择中的参数,您应该查看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);
    }
  }

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2021-12-27
      • 2012-07-07
      • 1970-01-01
      • 2015-04-02
      • 1970-01-01
      • 1970-01-01
      • 2021-12-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多