2008-10-20 4 views
3

Si quelqu'un utilise du texte Oracle (CTXSYS.CONTEXT), je me demande comment gérer les entrées utilisateur lorsque l'utilisateur souhaite rechercher des noms pouvant contenir une apostrophe.Oracle Text: Comment désinfecter l'entrée utilisateur

Echapper à la 'semble fonctionner dans certains cas, mais pas pour à la fin du mot - s est dans la liste des mots d'arrêt, et semble donc être supprimé.

Nous changeons actuellement un texte simple de requête (par exemple de tout ce qui est juste des lettres) à %text%, par exemple:

contains(field, :text) > 0 

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

Est-ce que quelqu'un qui utilise Oracle Text a traité ce problème?

Répondre

-2

Oubliez la désinfection. Pourquoi? Voir 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 instructions préparées. Si vous utilisez un DBI natif et qu'il ne le supporte pas, alors Dieu vous bénisse.

+3

Non en fait lié à la question. Les arguments de recherche Oracle Text sont définis à l'aide d'une grammaire spécifique et analysés par le moteur de recherche. (Un tas de procédures stockées, fondamentalement) Les instructions préparées n'aideront pas du tout. Les caractères spéciaux et les mots réservés doivent être échappés si l'API ne doit pas être présentée aux utilisateurs. – KarlP

2

Échappe tous les caractères spéciaux avec des antislashs. Les accolades ne fonctionneront pas avec les recherches de sous-chaîne car elles définissent des marques complètes. Par exemple,% {ello}% ne correspondra pas au jeton 'Hello'

Les caractères d'espacement échappés seront inclus dans le jeton de recherche, ainsi la chaîne de recherche '% stay \ near \ me%' sera traitée comme une chaîne littérale "reste près de moi" et n'invoquera pas l'opérateur "proche".

Si vous indexez des chaînes courtes (comme des noms, etc. (Malheureusement, CATSEARCH ne prend pas en charge la recherche de sous-chaînes ...)

Il est probablement judicieux de changer les recherches pour utiliser la sémantique du texte d'Oracle, avec la correspondance de jetons, mais pour certaines applications, l'expansion générique de plusieurs jetons (courts) et les jetons numériques créeront trop de hits pour les chaînes de recherche que les utilisateurs pourraient raisonnablement s'attendre à utiliser. Par exemple, une recherche sur "% 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" 'doit être recherché et fusionné avant que le résultat puisse être retourné. 'I' et 'AM' sont probablement aussi dans la liste d'arrêt par défaut et seront totalement ignorés, donc pour cette application hypothétique, une liste d'arrêt nulle peut être utilisée si ces jetons sont importants.

0

L'utilisation de PARAMETERS('STOPLIST ctxsys.empty_stoplist') lors de l'indexation inclurait tous les jetons alphabétiques dans l'index. Les caractères accentués sont également indexés. Les caractères non alphabétiques sont généralement traités comme des espaces par BASIC_LEXER.

En outre, grammaire CONTEXT utilise un grand nombre d'opérateurs qui incluent des symboles et des mots réservés tels que WITHIN, NEAR, ABOUT. Tout cela doit être échappé d'une manière ou d'une autre dans l'entrée. Si vous avez besoin de rechercher des sous-chaînes, l'approche correcte pour s'échapper est d'échapper tous les caractères avec \. Ceci est une réponse à une question connexe ici: Oracle text escaping with curly braces and wildcards. Si vos besoins sont de rechercher des termes entiers (noms, etc.), vous pouvez utiliser {input} plus simple.