Texte d'Oracle: comment assainir les entrées des utilisateurs

si quelqu'un a l'expérience de l'utilisation de texte Oracle ( CTXSYS.CONTEXT ), je me demande comment gérer les entrées de l'utilisateur quand l'utilisateur veut rechercher des noms qui peuvent contenir une apostrophe.

s'Échapper de la " semble fonctionner dans certains cas, mais pas pour s 'à la fin de la parole - s est dans la liste des mots vides, et semble être supprimés.

nous changeons actuellement le texte de requête simple (c.-à-d. tout ce qui est juste des lettres) à %text% , par exemple:

contains(field, :text) > 0

, Une recherche pour O'Neil œuvres", mais Joe ne fonctionne pas.

est-ce que quelqu'un utilisant Oracle Text a traité de cette question?

3
demandé sur rmtheis 2008-10-20 22:56:55

3 réponses

Échapper tous les caractères spéciaux par des barres obliques inverses. Les bracelets bouclés ne fonctionneront pas avec les recherches de substrats car ils définissent des jetons complets. Par exemple %{ello}% ne correspond pas le jeton "Bonjour"

les caractères D'Espace échappés seront inclus dans le jeton de recherche, de sorte que la chaîne de recherche '%stay\ near\ me%' sera traitée comme une chaîne littérale "stay near me" Et n'invoquera pas l'opérateur 'near'.

si vous indexez des chaînes courtes (comme des noms, etc) et vous pour que le texte D'Oracle se comporte exactement comme l'opérateur like, vous devez écrire votre propre lexer qui ne créera pas de tokens pour les mots individuels. (Malheureusement, CATSEARCH ne supporte pas la recherche par sous-couche...)

c'est probablement une bonne idée de changer les recherches pour utiliser la sémantique d'oracle text, avec l'appariement des jetons, mais pour certaines applications, l'expansion de jokers de jetons multiples (courts) et numériques va créer trop de hits pour les chaînes de recherche que les utilisateurs raisonnablement envisagez de travailler.

Eg, une recherche de "%I\ AM\ NUMBER\ 9%" échouera très probablement s'il y a beaucoup de jetons numériques dans les données indexées, puisque tous les jetons se terminant par 'I' et commençant par '9' doivent être recherchés et fusionnés avant que le résultat puisse être retourné.

je " et "SUIS" est probablement aussi par défaut dans la liste de mots vides, et sera totalement ignoré, donc, pour cette application hypothétique, null liste de mots vides peuvent être utilisés si ces jetons sont importantes.

2
répondu KarlP 2012-01-26 22:51:00

utilisant PARAMETERS('STOPLIST ctxsys.empty_stoplist') lorsque l'indexation inclurait tous les signes alphabétiques dans l'index. Les caractères accentués sont indexés. Les caractères non alphabétiques sont généralement traités comme des espaces par BASIC_LEXER.

aussi, la grammaire contextuelle utilise beaucoup d'opérateurs qui incluent des symboles et des mots réservés tels que WITHIN, NEAR, ABOUT. Ils ont tous à être échappé d'une certaine façon dans l'entrée. Si vous avez besoin de chercher des substrats, l'approche correcte pour s'échapper est de s'échapper tous les caractères avec \ . C'est une réponse à une question connexe ici: texte Oracle échapper avec des accolades bouclées et des caractères génériques . Si vous avez besoin de rechercher des termes entiers (noms, etc.)) vous pouvez utiliser plus simple {input} échapper.

0
répondu DKroot 2017-05-23 12:17:36

oubliez la désinfection. Pourquoi? Se référer à http://en.wikipedia.org/wiki/SQL_injection .

quel type D'API d'interface de base de données utilisez-vous? Perl DBI, ODBC, JDBC prennent en charge les requêtes paramétrées ou les déclarations préparées. Si vous utilisez un DBI natif et qu'il ne le supporte pas, alors que Dieu vous bénisse.

-2
répondu yogman 2008-10-21 00:37:51