postgresql - 有没有办法在 TypeORM 的选择部分绑定(bind)参数?

标签 postgresql typescript 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 注入(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 的第二个参数在内部执行的操作。

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);
    }
  }

关于postgresql - 有没有办法在 TypeORM 的选择部分绑定(bind)参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57553534/

相关文章:

sql - 递归删除一张表中的多行

typescript - 在 TypeScript 中从 `process.argv` 设置参数的类型,没有类型断言

typescript - 实体与关系的持久化问题

sql - TypeORM "OR"运算符

ruby-on-rails - 更新到 Rails 5.2 后 Postgres 创建不工作

python - 尝试在 python 测试中模拟 redshift 时出错

database - Postgres JOIN 与 unnest

TypeScript Express 错误函数

javascript - Angular2 intelliJ 配置错误..找不到模块 '@angular/core'

typescript - typeorm 和 nestjs 中的通用类型