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