Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Simple côte et double côte en SQL

11 réponses
Avatar
Daniel AUBRY
Bonjour à tous,

suite au problème de simple côte et double côte en SQL
je croyais avoir résolu le problème.
Quand ma variable à utiliser dans le SQL contient une
simple côte, je l'encradre de double double côte et quand
elle contient une double côte je fais un replace.
Mais je viens de me heurter à un nouveau problème :
je sauve des mots de passe dans une base Access et je
les crypte pour que seul mon appli puisse les lire. Cela
marche bien sauf si le mot de passe crypté contient à la
fois une simple ET une double côte.
Là, cela plante ADO et impossible d'utiliser le replace.

Si quelqu'un a déjà eu le problème............

Dany

10 réponses

1 2
Avatar
Fred
dans : news:44be54d2$0$5515$,
Daniel AUBRY écrivait :

Bonjour à tous,



Bonjour,

suite au problème de simple côte et double côte en SQL
je croyais avoir résolu le problème.
Quand ma variable à utiliser dans le SQL contient une
simple côte, je l'encradre de double double côte et quand
elle contient une double côte je fais un replace.
Mais je viens de me heurter à un nouveau problème :
je sauve des mots de passe dans une base Access et je
les crypte pour que seul mon appli puisse les lire. Cela
marche bien sauf si le mot de passe crypté contient à la
fois une simple ET une double côte.
Là, cela plante ADO et impossible d'utiliser le replace.

Si quelqu'un a déjà eu le problème............



Beaucoup l'ont eu.
Et la seule solution valable pour y remédier c'est d'utiliser la
collection Parameters de l'objet Command.
Et surtout ne jamais faire de concaténation.
Au passage, cela résout également d'autres problèmes, comme la mise en
forme des dates.

La technique de concaténation est la cible de tous les pirates en herbe
:-)
C'est ce qui est connu sous le nom de SQL Injection.

--
Fred
http://www.cerbermail.com/?3kA6ftaCvT
Avatar
SAISAS
Bonjour,

dans ton SQL, il faut doubler les valeurs des "quote" (pour moi c'est une
apostrophe en français).

Pour cela, tu peux utiliser la fonction replace, par exemple :

SQLpwd = """" & replace(pmw,"""","""""") & """"

Bonne réception.

"Daniel AUBRY" a écrit :

Bonjour à tous,

suite au problème de simple côte et double côte en SQL
je croyais avoir résolu le problème.
Quand ma variable à utiliser dans le SQL contient une
simple côte, je l'encradre de double double côte et quand
elle contient une double côte je fais un replace.
Mais je viens de me heurter à un nouveau problème :
je sauve des mots de passe dans une base Access et je
les crypte pour que seul mon appli puisse les lire. Cela
marche bien sauf si le mot de passe crypté contient à la
fois une simple ET une double côte.
Là, cela plante ADO et impossible d'utiliser le replace.

Si quelqu'un a déjà eu le problème............

Dany





Avatar
SAISAS
Bonjour,

je dois être très fatigué, et peut-être mon VB aussi ...

depuis des années, je remplace les "" par deux ", et je n'ai jamais eu de
problème.

Qu'ai je loupé dans le problème posé?

Merci.

"Fred" a écrit :

dans : news:44be54d2$0$5515$,
Daniel AUBRY écrivait :

> Bonjour à tous,

Bonjour,

> suite au problème de simple côte et double côte en SQL
> je croyais avoir résolu le problème.
> Quand ma variable à utiliser dans le SQL contient une
> simple côte, je l'encradre de double double côte et quand
> elle contient une double côte je fais un replace.
> Mais je viens de me heurter à un nouveau problème :
> je sauve des mots de passe dans une base Access et je
> les crypte pour que seul mon appli puisse les lire. Cela
> marche bien sauf si le mot de passe crypté contient à la
> fois une simple ET une double côte.
> Là, cela plante ADO et impossible d'utiliser le replace.
>
> Si quelqu'un a déjà eu le problème............

Beaucoup l'ont eu.
Et la seule solution valable pour y remédier c'est d'utiliser la
collection Parameters de l'objet Command.
Et surtout ne jamais faire de concaténation.
Au passage, cela résout également d'autres problèmes, comme la mise en
forme des dates.

La technique de concaténation est la cible de tous les pirates en herbe
:-)
C'est ce qui est connu sous le nom de SQL Injection.

--
Fred
http://www.cerbermail.com/?3kA6ftaCvT




Avatar
Fred
dans : news:,
SAISAS écrivait :

Bonjour,



Bonjour,

je dois être très fatigué, et peut-être mon VB aussi ...

depuis des années, je remplace les "" par deux ", et je n'ai jamais
eu de problème.



Cela fonctionne, je n'ai pas voulu dire le contraire. Quoique pour moi,
le délimiteur de chaînes en SQL, c'est plutôt l'apostophe, mais je ne
travaille pas avec access. Cette remarque m'incite encore plus à
utiliser les paramètres :-)

Qu'ai je loupé dans le problème posé?



Le problème, c'est qu'on n'est jamais très sûr de ne rien avoir loupé !
Comme Daniel le faisait remarquer, il utilisait une technique jamais
mise en défaut jusqu'au cas particulier.

Si je préfère utiliser les paramètres, c'est pour ne pas avoir à me
soucier de tous ces problèmes, et tout simplement parce que ce travail
que tu fais avec des replace, il est déjà fait dans les moteurs d'accès
aux données.

Ainsi, si tu ajoutes un paramètre de type chaîne, les séparateurs seront
automatiquement «échappés», quels qu'ils soient.
Si tu ajoutes un réel, tu n'as pas à remplacer le point par une virgule
ou le contraire.
Si tu ajoutes une date, elle sera intégrée dans la requête au bon format
et avec la bonne origine de temps (il me semble que cela peut varier).
Un booléen sera transformé de manière adéquat également.
Il y a certainement encore beaucoup d'exemples auxquels je ne pense pas
et auxquels je ne souhaite pas penser :-)

Voilà. Je tenais surtout à signaler que tout ce travail a déjà été fait
!



--
Fred
http://www.cerbermail.com/?3kA6ftaCvT
Avatar
Daniel AUBRY
Ok Fred mais il y a une chose que je n'ai pas
pigé.
Si Parameters = auto replace que devient ma côte ou
ma double côte quand je lis l'enregistrement.
Ne pas oublier que ce que je sauve est un mot de passe crypté.
Donc, si un caractère manque le décryptage est imposible.

En attendant, plutôt que de sauver les caractères, je sauve leur codes ascii
ce qui pour un mot de passe de 8 caractères maximum me genère une donnée
de 24 caractères.

Je crois que je vais m'en contenter, cela marche bien.

Dany
"Fred" a écrit dans le message de news:
%
dans : news:,
SAISAS écrivait :

Bonjour,



Bonjour,

je dois être très fatigué, et peut-être mon VB aussi ...

depuis des années, je remplace les "" par deux ", et je n'ai jamais
eu de problème.



Cela fonctionne, je n'ai pas voulu dire le contraire. Quoique pour moi, le
délimiteur de chaînes en SQL, c'est plutôt l'apostophe, mais je ne
travaille pas avec access. Cette remarque m'incite encore plus à utiliser
les paramètres :-)

Qu'ai je loupé dans le problème posé?



Le problème, c'est qu'on n'est jamais très sûr de ne rien avoir loupé !
Comme Daniel le faisait remarquer, il utilisait une technique jamais mise
en défaut jusqu'au cas particulier.

Si je préfère utiliser les paramètres, c'est pour ne pas avoir à me
soucier de tous ces problèmes, et tout simplement parce que ce travail que
tu fais avec des replace, il est déjà fait dans les moteurs d'accès aux
données.

Ainsi, si tu ajoutes un paramètre de type chaîne, les séparateurs seront
automatiquement «échappés», quels qu'ils soient.
Si tu ajoutes un réel, tu n'as pas à remplacer le point par une virgule ou
le contraire.
Si tu ajoutes une date, elle sera intégrée dans la requête au bon format
et avec la bonne origine de temps (il me semble que cela peut varier).
Un booléen sera transformé de manière adéquat également.
Il y a certainement encore beaucoup d'exemples auxquels je ne pense pas
et auxquels je ne souhaite pas penser :-)

Voilà. Je tenais surtout à signaler que tout ce travail a déjà été fait !



--
Fred
http://www.cerbermail.com/?3kA6ftaCvT


Avatar
Fred
dans : news:44c0ee43$0$19143$,
Daniel AUBRY écrivait :

Ok Fred mais il y a une chose que je n'ai pas
pigé.
Si Parameters = auto replace que devient ma côte ou
ma double côte quand je lis l'enregistrement.



Rien à craindre. Tout es transparent. Le contenu de ta base sera
exactement ce que tu as dans la variable que tu passes en paramètre :
c'est l'intérêt de la chose :-)

En attendant, plutôt que de sauver les caractères, je sauve leur
codes ascii ce qui pour un mot de passe de 8 caractères maximum me
genère une donnée de 24 caractères.



C'est une solution.
pourquoi 24 ? Tu mets des espaces ?
J'aurais dit 16 : 2 chiffres hexa pour chaque caractère.

Je crois que je vais m'en contenter, cela marche bien.



À l'occasion, jette tout de même un ½il aux paramètres. Une fois qu'on a
pigé le truc, je t'assure qu'on gagne du temps !

--
Fred
foleide at free.fr
Avatar
Daniel AUBRY
Merci,

je serai bien preneur d'un petit bout d'soft exemple.
A tout hasard.............

"Fred" a écrit dans le message de news:

dans : news:44c0ee43$0$19143$,
Daniel AUBRY écrivait :

Ok Fred mais il y a une chose que je n'ai pas
pigé.
Si Parameters = auto replace que devient ma côte ou
ma double côte quand je lis l'enregistrement.



Rien à craindre. Tout es transparent. Le contenu de ta base sera
exactement ce que tu as dans la variable que tu passes en paramètre :
c'est l'intérêt de la chose :-)

En attendant, plutôt que de sauver les caractères, je sauve leur
codes ascii ce qui pour un mot de passe de 8 caractères maximum me
genère une donnée de 24 caractères.



C'est une solution.
pourquoi 24 ? Tu mets des espaces ?
J'aurais dit 16 : 2 chiffres hexa pour chaque caractère.

Je crois que je vais m'en contenter, cela marche bien.



À l'occasion, jette tout de même un ½il aux paramètres. Une fois qu'on a
pigé le truc, je t'assure qu'on gagne du temps !

--
Fred
foleide at free.fr


Avatar
Fred
dans : news:44c130e4$0$19138$,
Daniel AUBRY écrivait :

Merci,

je serai bien preneur d'un petit bout d'soft exemple.
A tout hasard.............




Ici un exemple :
http://msdn.microsoft.com/library/en-us/ado270/htm/mdmthappendx.asp

Je n'ai pas vb6 sous la main pour tester des variantes mais je crois me
souvenir qu'il y en a.
Dans cet exemple, la méthode peut se décomposer comme suit :
création d'un paramètre en le nommant, en donnant son type et sa
direction
affectation d'une valeur à ce paramètre
ajout du paramètre à la collection de paramètres de la commande.

Toujours de mémoire, en OleDb Access, les paramètres sont simplement
spécifiés par des points d'interrogation. Donc dans ce cas, je pense que
le nom donné au paramètre est simplement ignoré. Mais pas l'ordre dans
lequel ils sont insérés.

Ton code pourrait donner quelque chose du genre :

Dim cmd as New ADODB.Command
Dim prm as ADODB.Parameter

cmd.CommandText = "UPDATE pwdtable SET pwd=? WHERE id=?;"
cmd.CommandType = adCmdText

Set prm=cmd.CreateParameter("toto", adString, adParamInput)
prm.Value=laVariableQuiContientLeCryptage
cmd.Parameters.Append prm

Set prm=cmd.CreateParameter("titi", adInteger, adParamInput)
prm.Value=laVariableQuiContientLaClé
cmd.Parameters.Append prm

'ouverture de la connexion et
cmd.Execute

J'espère que ce n'est pas trop buggé. Bonne lecture.

--
Fred
foleide at free.fr
Avatar
Daniel AUBRY
Merci,

je teste tout cela dès samedi soir..

"Fred" a écrit dans le message de news:
ukOQ$
dans : news:44c130e4$0$19138$,
Daniel AUBRY écrivait :

Merci,

je serai bien preneur d'un petit bout d'soft exemple.
A tout hasard.............




Ici un exemple :
http://msdn.microsoft.com/library/en-us/ado270/htm/mdmthappendx.asp

Je n'ai pas vb6 sous la main pour tester des variantes mais je crois me
souvenir qu'il y en a.
Dans cet exemple, la méthode peut se décomposer comme suit :
création d'un paramètre en le nommant, en donnant son type et sa direction
affectation d'une valeur à ce paramètre
ajout du paramètre à la collection de paramètres de la commande.

Toujours de mémoire, en OleDb Access, les paramètres sont simplement
spécifiés par des points d'interrogation. Donc dans ce cas, je pense que
le nom donné au paramètre est simplement ignoré. Mais pas l'ordre dans
lequel ils sont insérés.

Ton code pourrait donner quelque chose du genre :

Dim cmd as New ADODB.Command
Dim prm as ADODB.Parameter

cmd.CommandText = "UPDATE pwdtable SET pwd=? WHERE id=?;"
cmd.CommandType = adCmdText

Set prm=cmd.CreateParameter("toto", adString, adParamInput)
prm.Value=laVariableQuiContientLeCryptage
cmd.Parameters.Append prm

Set prm=cmd.CreateParameter("titi", adInteger, adParamInput)
prm.Value=laVariableQuiContientLaClé
cmd.Parameters.Append prm

'ouverture de la connexion et
cmd.Execute

J'espère que ce n'est pas trop buggé. Bonne lecture.

--
Fred
foleide at free.fr


Avatar
SAISAS
Bonjour,

désolé de rajouter un message à une liste déjà longue, mais je ne comprends
pas vraiment l'intérêt de passer par la collection paramètres lorsque l'on
n'y est pas obligé (cas des procédures stockées en particulier).

Pour le problème exposé, j'utiliserais un recordset en affectant directement
dans la zone concernée :

Set MonRecordset = Connexion.execute(SELECT CleCrypto FROM Table WHERE ...)
MonRecordset.fields(0).Value = CleCrypto
MonRecordset.Update
MonRecordset.Close

Bonne réception.

"Fred" a écrit :

dans : news:44c130e4$0$19138$,
Daniel AUBRY écrivait :

> Merci,
>
> je serai bien preneur d'un petit bout d'soft exemple.
> A tout hasard.............


Ici un exemple :
http://msdn.microsoft.com/library/en-us/ado270/htm/mdmthappendx.asp

Je n'ai pas vb6 sous la main pour tester des variantes mais je crois me
souvenir qu'il y en a.
Dans cet exemple, la méthode peut se décomposer comme suit :
création d'un paramètre en le nommant, en donnant son type et sa
direction
affectation d'une valeur à ce paramètre
ajout du paramètre à la collection de paramètres de la commande.

Toujours de mémoire, en OleDb Access, les paramètres sont simplement
spécifiés par des points d'interrogation. Donc dans ce cas, je pense que
le nom donné au paramètre est simplement ignoré. Mais pas l'ordre dans
lequel ils sont insérés.

Ton code pourrait donner quelque chose du genre :

Dim cmd as New ADODB.Command
Dim prm as ADODB.Parameter

cmd.CommandText = "UPDATE pwdtable SET pwd=? WHERE id=?;"
cmd.CommandType = adCmdText

Set prm=cmd.CreateParameter("toto", adString, adParamInput)
prm.Value=laVariableQuiContientLeCryptage
cmd.Parameters.Append prm

Set prm=cmd.CreateParameter("titi", adInteger, adParamInput)
prm.Value=laVariableQuiContientLaClé
cmd.Parameters.Append prm

'ouverture de la connexion et
cmd.Execute

J'espère que ce n'est pas trop buggé. Bonne lecture.

--
Fred
foleide at free.fr




1 2