Maison >développement back-end >Golang >Comment puis-je obtenir une correspondance de modèle littéral dans des expressions PostgreSQL LIKE avec une entrée utilisateur non validée ?

Comment puis-je obtenir une correspondance de modèle littéral dans des expressions PostgreSQL LIKE avec une entrée utilisateur non validée ?

Linda Hamilton
Linda Hamiltonoriginal
2024-11-21 05:00:12525parcourir

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

Correspondance de modèles littéraux dans les expressions LIKE de PostgreSQL pour les entrées utilisateur non validées

Lors de la correspondance des entrées utilisateur avec un modèle LIKE dans PostgreSQL, il est essentiel d'échapper des caractères de modèle spéciaux comme "_" et "%" pour garantir une correspondance littérale. PostgreSQL exige que ces caractères soient cités à l'aide de la barre oblique inverse () ou d'un caractère d'échappement personnalisé défini avec la clause ESCAPE.

Par exemple, pour faire correspondre "rob" littéralement, vous devrez échapper à toute entrée utilisateur contenant des traits de soulignement ou signes de pourcentage. Cependant, il existe ici un piège potentiel : si votre entrée utilisateur contient également des barres obliques inverses, elles devront également être échappées. Cela peut devenir complexe et entraîner des bugs.

Solution côté serveur

Pour gérer cela avec élégance, vous pouvez tirer parti de la fonction replace() de PostgreSQL pour remplacer les caractères spéciaux par leur versions échappées. Cette approche présente plusieurs avantages :

  • Elle est effectuée sur le serveur, éliminant ainsi le besoin de manipulation côté client.
  • Elle échappe à tous les caractères nécessaires, garantissant ainsi la cohérence.
  •  Cela fonctionne de manière transparente même lorsque la saisie de l'utilisateur contient des caractères spéciaux en plus des traits de soulignement et des signes de pourcentage.

Par exemple, pour rechercher "rob" littéralement, vous pouvez utiliser la requête suivante :

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

Dans cette requête :

  • $1 est un espace réservé pour la saisie de l'utilisateur.
  • remplacer ($1,'^','^^') échappe à tous les caractères caret (^) dans l'entrée string.
  • replace(replace($1,'^','^^'),'%','^%') échappe à tout signe de pourcentage (%) dans la chaîne d'entrée.
  • replace(replace(replace($1,'^','^^'),'%','^%'),'_','^_') échappe à tous les traits de soulignement (_) dans l'entrée string.
  • ||'%' ajoute un signe de pourcentage final à la chaîne de recherche pour la correspondance du préfixe.
  • ESCAPE '^' spécifie "^" comme caractère d'échappement, vous permettant d'échapper à tout des trois caractères spéciaux.

Conclusion

En utilisant côté serveur remplacement et un caractère d'échappement personnalisé, vous pouvez garantir une correspondance de modèle littéral dans les expressions PostgreSQL LIKE pour les entrées utilisateur non validées. Cette approche est robuste, évite les vulnérabilités d'injection et simplifie le code.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn