Fonction de remplacement de caractères

cs_Icewall Messages postés 9 Date d'inscription mercredi 9 juillet 2008 Statut Membre Dernière intervention 14 juillet 2010 - 20 mars 2010 à 06:27
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 - 21 mars 2010 à 07:15
Bonjour à tous.
Je viens de faire ce code en vb.net ce matin. Je débute et j'ai pas les idées très claires à cette heure-ci.
Quelqu'un pourrait-il jeter un oeil à mon code svp ?
Je devrais utiliser une structure avec un select case mais je ne vois pas commment faire car la valeur de mon pattern varie chaque fois.

 Function f_replace_char(ByRef test_string As String)

        Dim pattern As String = "'"
        Dim m As Match = Regex.Match(test_string, pattern)

        If m.Success = True Then
            test_string = Replace(test_string, pattern, "''")
        End If

        pattern = ";"
        If m.Success = True Then
            test_string = Replace(test_string, pattern, "''")
        End If

        pattern = "--"
        If m.Success = True Then
            test_string = Replace(test_string, pattern, "''")
        End If

        pattern = "/*"
        If m.Success = True Then
            test_string = Replace(test_string, pattern, "''")
        End If

        pattern = "*/"
        If m.Success = True Then
            test_string = Replace(test_string, pattern, "''")
        End If

        pattern = "xp_"
        If m.Success = True Then
            test_string = Replace(test_string, pattern, "''")
        End If

        Return test_string
    End Function


C'est juste un essai. Je sais que le code n'est pas correct. C'est juste une idée en passant pour nettoyer les chaînes de caractères afin d'éviter les injections SQL. Il me faut juste un petit coup de pouce

6 réponses

Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
20 mars 2010 à 07:49
du grand n'importe quoi...

tu mets a jour ta variable pattern, qui n'est pas liée, en aucune facon à m (RegExp)
tu fais donc n fois le même m.Success

et tu fais un Replace (String)
et non un Regplace Regexp (via une des methodes de m)

enfin, puisque le but du jeu est de emplacer tout ces patterns par ''
tu peux le faire en trois lignes de code !


Pour éviter les injections SQL, ne fais pas de constructions :

" ... WHERE login='" & maVar & "' "

passe par des requetes parametrées...

Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
0
cs_christoni Messages postés 140 Date d'inscription mardi 25 novembre 2003 Statut Membre Dernière intervention 1 novembre 2010 7
20 mars 2010 à 17:18
Bonjour,
pas besoin d'un Select Case, il suffit de regrouper toutes les chaînes string dans le Pattern.
"(')+|(;)+|(--)+|(/\*)+|(\*/)+|(xp_)+"

Entre-parenthèse se trouve la chaîne à chercher.
A noter l'antislash "" permet de chercher un méta-caractère(# ! ^ $ ( ) [ ] { } | ? + * . \) dans sa valeur littérale
Le "+" signifie 1 ou plusieurs.
Le "|" veut dire "ou"

Enfin pour remplacer, code suivant à tester :
    Function f_replace_char(ByRef test_string As String) As String

        Dim pattern As String
        Dim m As Match

        pattern = "(')+|(;)+|(--)+|(/\*)+|(\*/)+|(xp_)+"
        m = Regex.Match(test_string, pattern)
        test_string = Regex.Replace(test_string, pattern, "''")

        Return test_string
    End Function
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
20 mars 2010 à 18:40
nul besoin du +

se simplifie du coup ainsi :

"(')+|(;)+|(--)+|(/\*)+|(\*/)+|(xp_)+"

en

"[';]|(--)|(/\*)|(\*/)|(xp_)"

Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
0
cs_christoni Messages postés 140 Date d'inscription mardi 25 novembre 2003 Statut Membre Dernière intervention 1 novembre 2010 7
20 mars 2010 à 20:46
Bonsoir,
Je débute
dit il.
Renfield, votre réponse vient à point en complément.
Pour ma part j'ai voulu marquer le coup :
(chaîne recherchée) quantifieur ou (autre chaîne recherchée)quantifieur ou etc...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Icewall Messages postés 9 Date d'inscription mercredi 9 juillet 2008 Statut Membre Dernière intervention 14 juillet 2010
21 mars 2010 à 02:06
Merci pour vos réponses !

Ah dire vrai, cela faisait 9 mois que je ne faisais plus que du réseau et donc que je ne programmais plus. Difficile le retour aux sources...

Je vais me renseigner sur les expressions régulières puisque j'ai des lacunes sur ce sujet.
Visiblement le caractère | permet de mettre plusieurs expressions dans le pattern. Si seulement j'y avais pensé avant...
Donc je note l'antislash avant le backslash.

Par contre je n'ai pas compris pourquoi mettre cette expression entre crochets [';]

Voilà les recommandations de Microsoft concernant les injections SQL : Lien

Je ne sais pas si leurs conseils s'appliquent aussi pour le like si je construis mes requêtes en Linq comme ceci :

Imports System.Data.Linq.SqlClient

...

        Dim context As classe_linqDataContext = New classe_linqDataContext
        Dim t_person As Linq.Table(Of linq_application.Person) = context.Person

        Dim s_search As String = "kim"
        Dim s_start As String = "ki"
        Dim s_end As String = "im"
        Dim s_joker As String = "%"
        Dim s_char As String = "_"

        Dim q_like_start_1 = From q In t_person Where SqlMethods.Like(q.FirstName, s_start + s_joker) Select q.FirstName
        Dim q_like_start_2 = From q In t_person Where SqlMethods.Like(q.FirstName, s_start + s_char) Select q.FirstName
        Dim q_like_end_1 = From q In t_person Where SqlMethods.Like(q.FirstName, s_joker + s_end) Select q.FirstName
        Dim q_like_end_2 = From q In t_person Where SqlMethods.Like(q.FirstName, s_char + s_end) Select q.FirstName
        Dim q_like_search = From q In t_person Where SqlMethods.Like(q.FirstName, s_joker + s_search + s_joker) Select q.FirstName



J'ai utilisé cette façon car le code en dessous ne permet pas d'intégrer les recherche avec le % ou _
Mais j'aurais pu aussi utiliser le startwith ou endwith.

        Dim q_like_exact = From q In t_person Where q.FirstName Like s_search


Qu'en pensez vous ?
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
21 mars 2010 à 07:15
regarde pas le code de MS, ils jouent avec LINQ

pour les regexp, voir:

http://regex.codes-sources.com/

pour [';]
c'est la base

signifie '|;


Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
0
Rejoignez-nous