postgresql - Finnes det noen måte å binde parameter i select-delen for TypeORM?


Jeg prøver å implementere søk med pg_trgm-modulen i PostgreSQL på et prosjekt skrevet med TypeScript og TypeOrm. SQL-en som fungerer for meg ser slik ut:

SELECT t, similarity(t, 'word') AS sml
  FROM test_trgm
  WHERE t % 'word'
  ORDER BY sml DESC, t;

Men når jeg begynte å integrere det i min builder, innså jeg at jeg ikke kan beskytte select-setninger mot SQL-injeksjon siden TypeOrm ikke tilbyr å binde parametere i noen av select-metodene (slik som SelectQueryBuilder::addSelect, SelectQueryBuilder::select).

Eksempel på min sårbare metode:

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

Kanskje noen vet en bedre måte å gjennomføre dette søket på i min teknologistabel?

Svar #1

Jeg trengte en lignende løsning, men din var ikke nok for meg. Hvis du uansett ønsker å endre parameteren i select burde du se på setParameter, som er det den andre parameteren til addWhere gjør internt.

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

så i ditt tilfelle kunne du ha løpt med

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

Svar #2

Avgjørelsen av dette problemet var å bruke samme bindingstast i where og select-setningene på følgende måte.

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

Relaterte artikler