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
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
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()
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
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
14418100cookie-checkSo führen Sie eine ähnliche Abfrage durch TypeORMyes