PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 14/01/2013 17:06:05

charlie echo
Membre

Problème de guillemets lors d'une insertion

Bonjour,
j'ai développé un site sur mon PC qui fonctionne avec PHP et PostgreSQL 9.1.
J'ai besoin d'ajouter des formulaires avec guillemets simples (')  et doubles ( " ) ; j'utilise la fonction pg_escape_string et ça marche bien.
La requête est :
$sql = sprintf("insert into table (message) values ('%s')", pg_escape_string($mess));


J'ai mis ce site avec le même code sur OVH, avec PostgreSQL 8.4 .
Là, quand j'ajoute des guillemets, il me les renvoie avec des anti-slash.
exemple : Le message d'hier.    devient :  le message d\'hier.

Je n'arrive pas à m'en débarrasser, sauf si j’enlève la fonction pg_escape_string :
$sql = sprintf("insert into table (message) values ('%s')", $mess);
Mais j'ai alors un trou de sécurité.

Que peut-il se passer ? Est-ce une histoire d'encodage (je pense être en UTF-8 partout).

Merci pour toute piste !

Hors ligne

#2 14/01/2013 20:05:53

rjuju
Administrateur

Re : Problème de guillemets lors d'une insertion

Bonjour,

peut-être avec la fonction pg_escape_literal() ? (je n'ai pas fait de php depuis longtemps). L'échappement de postgres est lié à la norme SQL (pas de \, sauf échappement explicite avec un E devant la chaîne). Voir http://docs.postgresqlfr.org/9.1/sql-sy … ngs-escape

Hors ligne

#3 15/01/2013 16:14:40

charlie echo
Membre

Re : Problème de guillemets lors d'une insertion

Argh, ça ne marche pas (mais merci d'avoir essayé !) :
pg_escape_literal n'est supporté que sur les versions récentes de PHP, et sur OVH, le PHP n'est pas assez récent...

J'ai pris soin de n'utiliser que des fonctions de PHP suffisamment "anciennes".

D'autres idées ?

Hors ligne

#4 15/01/2013 20:10:15

rjuju
Administrateur

Re : Problème de guillemets lors d'une insertion

Avez-vous essayé avec un échappement explicite ?


$sql = sprintf("insert into table (message) values (E'%s')", pg_escape_string($mess));

Hors ligne

#5 16/01/2013 00:28:33

charlie echo
Membre

Re : Problème de guillemets lors d'une insertion

Ca ne marche pas mieux...

En fait j'ai le sentiment que mon code PHP est correct (puisqu'il fonctionne sur mon PC), mais que la base est "mal configurée".

Hors ligne

#6 16/01/2013 02:11:36

dverite
Membre

Re : Problème de guillemets lors d'une insertion

Ca ressemble à une mauvaise prise en compte de standard_conforming_strings.
Voir la doc à ce sujet: http://docs.postgresqlfr.org/9.1/sql-syntax.html


En 9.1, standard_conforming_strings est à ON par défaut alors qu'en 8.4 il était à OFF.
Mais le code montré avec le sprintf() est correct. Il doit fonctionner en 8.4, en 9.1 et quelque soit
la valeur de standard_conforming_strings, parce que  pg_escape_string() fait ce qu'il faut dans tous les cas de figure.


Sinon il faut faire attention en PHP à désactiver les "magic quotes"
(voir http://php.net/manual/fr/security.magicquotes.php) qui  transforment les champs
des posts pour y ajouter des antislashs et qui entrent justement en conflit avec l'échappement explicite.
Voir pour ça voir la valeur de get_magic_quotes_gpc()

Dernière modification par dverite (16/01/2013 02:12:05)


@DanielVerite

Hors ligne

#7 16/01/2013 13:38:53

charlie echo
Membre

Re : Problème de guillemets lors d'une insertion

Bien vu !

J'ai essayé de jouer avec les standard_conforming_string, sans succès, effectivement, car pg_escape_strings devait suffire.

Mais effectivement, je n'avais pas pensé aux magic_quotes, et les config sont différents sur mes serveurs local et distant !
Merci pour ces éclairages ; je vais continuer ma quête sur les forum PHP pour voir comment désactiver ça proprement.

Hors ligne

Pied de page des forums