Échappement de chaînes
Parmis les nouveautés de la
prochaine version de
PostgreSQL, la fameuse
9.1
,
il faut signaler le changement de valeur par défaut de la variable
standard_conforming_strings
, qui passe à
vraie.
En effet, l’utilisation d’échappements avec le caractère « anti-slash »
n’est pas conforme au standard SQL. Le paramètre
standard_conforming_strings
permet de contrôler le comportement de
PostgreSQL lorsqu’il lit une chaîne de caractère dans une requête SQL.
Voyons quelques exemples :
dimitri=# set standard_conforming_strings to true;
SET
dimitri=# select 'hop''';
?column?
----------
hop'
(1 ligne)
dimitri=# select 'hop\'';
dimitri'# ';
?column?
----------
hop\';
(1 ligne)
dimitri=# select E'hop\'';
?column?
----------
hop'
(1 ligne)
dimitri=# set standard_conforming_strings to false;
SET
dimitri=# select E'hop\'';
?column?
----------
hop'
(1 ligne)
dimitri=# select 'hop\'';
ATTENTION: utilisation non standard de \' dans une chaîne littérale
LIGNE 1 : select 'hop\'';
^
ASTUCE : Utilisez '' pour écrire des guillemets dans une chaîne ou utilisez
la syntaxe de chaîne d'échappement (E'...').
?column?
----------
hop'
(1 ligne)
Il existe un moyen de forcer PostgreSQL à accepter l’utilisation
d’échappements avec « anti-slash » indépendamment de la valeur de
standard_conforming_strings
, c’est la notation préfixée avec
E
. Il est
recommandé de toujours l’utiliser dès lors que la chaîne de caractère
contient des « anti-slash » utilisés comme échappement (du caractère simple
guillemet en général).
Le paramètre
escape_string_warning
, enfin, permet de désactiver les
avertissements tels que présentés dans le dernier exemple ci-dessus,
lorsqu’il est positionné à
off
. Bien sûr, sa valeur par défaut est
on
.
Toute apparition de ce
WARNING lorsque
escape_string_warning
est
on
signifie
que votre application n’est pas prête à migrer à
9.1
avec son paramétrage
par défaut. Il existe deux actions possible : changer le paramétrage de sa
nouvelle valeur par défaut à sa précédente, ou bien corriger ses
applications pour utiliser le préfixe
E
dès que cela est nécessaire.
L’utilisation de
standard_conforming_strings
à
on
présente un autre avantage
au respect du standard SQL : la sécurité contre les injections. S’il n’est
pas possible d’échapper le guillemet simple qui termine toute chaîne de
caractère utilisateur, il devient compliqué de jouer au plus malin avec le
parser. Le mieux ici reste bien sûr d’utiliser les requêtes paramétrées, à
suivre dans un prochain article.