Heim >Backend-Entwicklung >Golang >Wie kann ich einen literalen Mustervergleich in PostgreSQL-LIKE-Ausdrücken mit nicht validierten Benutzereingaben erreichen?

Wie kann ich einen literalen Mustervergleich in PostgreSQL-LIKE-Ausdrücken mit nicht validierten Benutzereingaben erreichen?

Linda Hamilton
Linda HamiltonOriginal
2024-11-21 05:00:12525Durchsuche

How Can I Achieve Literal Pattern Matching in PostgreSQL LIKE Expressions with Unvalidated User Input?

Literaler Musterabgleich in PostgreSQL-LIKE-Ausdrücken für nicht validierte Benutzereingaben

Beim Abgleichen von Benutzereingaben mit einem LIKE-Muster in PostgreSQL ist die Escape-Funktion unbedingt erforderlich Sondermusterzeichen wie „_“ und „%“, um eine wörtliche Übereinstimmung sicherzustellen. PostgreSQL erfordert, dass diese Zeichen mit dem Backslash () oder einem benutzerdefinierten Escape-Zeichen, das mit der ESCAPE-Klausel definiert wird, in Anführungszeichen gesetzt werden.

Um beispielsweise „rob“ wörtlich zu finden, müssten Sie alle Benutzereingaben mit Unterstrichen oder maskieren Prozentzeichen. Allerdings gibt es hier eine potenzielle Gefahr: Wenn Ihre Benutzereingabe auch Backslashes enthält, müssen diese ebenfalls maskiert werden. Dies kann komplex werden und zu Fehlern führen.

Serverseitige Lösung

Um dies elegant zu handhaben, können Sie die Funktion „replace()“ von PostgreSQL nutzen, um Sonderzeichen durch ihre zu ersetzen entkommene Versionen. Dieser Ansatz hat mehrere Vorteile:

  • Er wird auf dem Server ausgeführt, sodass keine clientseitige Handhabung erforderlich ist.
  • Alle erforderlichen Zeichen werden maskiert, um Konsistenz sicherzustellen.
  • Es funktioniert reibungslos, auch wenn die Benutzereingabe neben Unterstrichen und Prozentzeichen auch Sonderzeichen enthält.

Um beispielsweise wörtlich nach „rob“ zu suchen, könnten Sie die folgende Abfrage verwenden:

SELECT * FROM users WHERE name LIKE replace(replace(replace(,'^','^^'),'%','^%'),'_','^_') ||'%' ESCAPE '^'

In dieser Abfrage:

  • $1 ist ein Platzhalter für die Benutzereingabe.
  • replace($1,'^','^^') entgeht jedem Caret Zeichen (^) in der Eingabezeichenfolge.
  • replace(replace($1,'^','^^'),'%','^%') maskiert alle Prozentzeichen (%) in der Eingabe string.
  • replace(replace(replace($1,'^','^^'),'%','^%'),'_','^_') entgeht allen Unterstrichen (_ ) in der Eingabezeichenfolge.
  • ||'%' hängt ein abschließendes Prozentzeichen an die Suchzeichenfolge für den Präfixabgleich an.
  • ESCAPE '^' gibt „^“ als Escape-Zeichen an und ermöglicht so Sie können eines der drei Sonderzeichen maskieren.

Fazit

Durch die Verwendung serverseitiger Ersetzung und eines benutzerdefinierten Escape-Zeichens können Sie eine wörtliche Musterübereinstimmung sicherstellen in PostgreSQL-LIKE-Ausdrücken für nicht validierte Benutzereingaben. Dieser Ansatz ist robust, vermeidet Injektionsschwachstellen und vereinfacht den Code.

Das obige ist der detaillierte Inhalt vonWie kann ich einen literalen Mustervergleich in PostgreSQL-LIKE-Ausdrücken mit nicht validierten Benutzereingaben erreichen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn