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 :
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 :
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!