So führen Sie eine ähnliche Abfrage durch TypeORM

Lesezeit: 4 Minuten

Benutzeravatar von Gardezi
Gardezi

Hallo Leute, ich versuche, alle Ergebnisse zu finden, die ein enthalten. Ich habe ein paar Möglichkeiten ausprobiert, aber das Problem ist, dass nichts funktioniert. Es gibt nur ein leeres Array zurück

var data = await getRepository(User)
  .createQueryBuilder("user")
  .where("user.firstName = %:name%", { name: firstName })
  .getMany();

und sowas

var data = await getRepository(User)
  .createQueryBuilder("user")
  .where("user.firstName like %:name%", { name: firstName })
  .getMany();

aber nichts funktioniert. All dies gibt mir ein leeres Array zurück. Kann mir jemand weiterhelfen danke

Benutzeravatar von pleerock
Pleerock

Der richtige Weg ist:

 var data = await getRepository(User)
                  .createQueryBuilder("user")
                  .where("user.firstName like :name", { name:`%${firstName}%` })
                  .getMany();

  • Wird dies richtig entkommen firstName?

    – Benutzer3413723

    8. September 2018 um 15:25 Uhr

  • Ich habe es getestet … Ich denke, es parametrisiert es.

    – Benutzer3413723

    8. September 2018 um 15:28 Uhr

  • @ user3413723 Ich habe das gerade getestet. Es maskiert Anführungszeichen und andere Zeichen, aber es maskiert nicht (und könnte es nicht) “%” und “_” Zeichen.

    – david_p

    19. Februar 2019 um 19:17 Uhr

  • SQL-Injektion!!!!

    – Siyavash Hamdi

    11. Januar 2022 um 3:07 Uhr

  • Gibt es dazu offizielle Unterlagen? Ich konnte nicht finden

    – Shiva Sankaran

    27. April 2022 um 13:10 Uhr

TypeORM bietet out-of-the-box Like Funktion. Beispiel aus ihren Unterlagen:

import {Like} from "typeorm";

const loadedPosts = await connection.getRepository(Post).find({
    title: Like("%out #%")
});

in Ihrem Fall:

var data = await getRepository(User).find({
    name: Like(`%${firstName}%`)
});

  • Wenn Sie hierher kommen und suchen ilike wie ich es war, scheint es in einer bevorstehenden Veröffentlichung zu kommen: github.com/typeorm/typeorm/pull/5828

    – Aaron

    21. Juli 2020 um 13:36 Uhr

  • Wenn die firstName kein sicherer Wert ist, ist Ihre Lösung nicht gegen SQL-Injection geschützt

    – Luca Roverelli

    8. September 2020 um 11:00 Uhr

  • @LucaRoverelli wie mache ich es sicher vor SQL-Injection? ist es möglich, die gleiche Syntax zu verwenden?

    – für J

    23. Juni 2021 um 3:21 Uhr

  • funktioniert nicht auf mongodb

    – Muhammad Awais

    2. Juni 2022 um 15:10 Uhr

  • @LucaRoverelli Ich denke, die Lösung ist gegen SQL-Injektion geschützt, da wir hier keine Rohabfrage erstellen. Der Wert wird wie in der SQL-Abfrage parametrisiert eingefügt. Wir können die zugrunde liegende Abfrage überprüfen, indem wir die Protokollierungsoption in der Datenquelle aktivieren.

    – pathe.kiran

    25. Oktober 2022 um 10:53 Uhr

Sie können auch die Datenbankfunktion für die Verkettung verwenden. In Postgres zum Beispiel:

 var data = await getRepository(User)
              .createQueryBuilder("user")
              .where("user.firstName like '%' || :name || '%'", {name: firstName })
              .getMany();

Es scheint, dass alle Antworten zum Zeitpunkt des Schreibens, einschließlich der akzeptierten Antwort von Pleerock, anfällig für SQL-Injection sind, es sei denn, die Benutzereingabe wurde zuvor bereinigt.

 var data = await getRepository(User)
              .createQueryBuilder("user")
              .where("user.firstName like :name", { name:`%${firstName}%`})
              .getMany();

Die Tatsache, dass der obige Code in TypeORM gültig ist, macht es so, dass jede Abfrage dieses Stils anfällig für Datenexfiltration ist. Stellen Sie sich die folgende ähnliche Abfrage vor:

 const data = await getRepository(User)
          .createQueryBuilder("user")
          .where("user.firstName like :name", { name: firstName })
          .getOne();

Nicht bereinigte Daten, die vom Benutzer eingehen, enthalten % Charakter, in den hineingesendet wird firstName in der obigen Abfrage (zB let firstName="%John") würde es einem Benutzer ermöglichen, potenziell private Daten über andere Benutzer herauszufiltern.

Daher sollte man, wo es der Anwendungsfall zulässt sicherstellen dass alle Benutzereingaben bereinigt und alle Sonderzeichen entfernt werden.

Alternativ kann in MySQL, wo der Anwendungsfall erfordert, dass Sonderzeichen im Text vorhanden sind, eine Volltextsuche angemessener sein. Dies ist jedoch teurer im Unterhalt.

Volltextsuche in relevanter Spalte erstellen und Abfrage durchführen

    export class User {
        @PrimaryGeneratedColumn()
        id: number;

        @Index({fulltext: true})
        @Column()
        name: string;
    }

    const data = await this.repository
         .createQueryBuilder()
         .select()
         .where('MATCH(name) AGAINST (:name IN BOOLEAN MODE)', {name: name})
         .getOne()

Benutzeravatar von Herman Demsong
Hermann Demson

var data = await  getRepository(User)
                        .createQueryBuilder("user")
                        .where("user.firstName ILIKE %q", {q:`%${VALUE_HERE}%` })
                .getMany();

So mache ich es. Ich hoffe es hilft

  • Dies ist anfällig für SQL-Injection.

    – Gerber Burton

    21. Dezember 2021 um 23:04 Uhr

  • @tannerburton warum? bereinigt TypeORM den Parameter nicht, auch wenn er von % umgeben ist?

    – Petruza

    3. Februar um 14:56 Uhr

Benutzeravatar von Salah ED
Salah ED

mit repositories lege ich es in die Wo zum Beispiel :

await this.userRepository.findAndCount({
      relations: ['roles', 'company'],
      where: `(username like '%${seachValue}%' or firstname like '%${seachValue}%' 
      or lastname like '%${seachValue}%' or email like '%${seachValue}%')`,
      order: {
        [sortField]: sortDirection,
      },
    });

  • Dies ist anfällig für SQL-Injection.

    – Gerber Burton

    21. Dezember 2021 um 23:04 Uhr

  • @tannerburton warum? bereinigt TypeORM den Parameter nicht, auch wenn er von % umgeben ist?

    – Petruza

    3. Februar um 14:56 Uhr

1441810cookie-checkSo führen Sie eine ähnliche Abfrage durch TypeORM

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy