Vous n'êtes pas identifié(e).
Pages : 1
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
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
Julien.
https://rjuju.github.io/
Hors ligne
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
Avez-vous essayé avec un échappement explicite ?
$sql = sprintf("insert into table (message) values (E'%s')", pg_escape_string($mess));
Julien.
https://rjuju.github.io/
Hors ligne
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
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
http://blog-postgresql.verite.pro/
Hors ligne
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
Pages : 1