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).

#26 03/06/2011 13:38:33

Marc Cousin
Membre

Re : fonction pl gsql

Non, c'est l'opérateur de concaténation.

Vous lui dites de prendre les chaînes à sa gauche et à sa droite pour créer une nouvelle chaîne contenant les deux.

Vous  passez donc à execute la concaténation de l'ensemble des chaînes qui sont derrière lui. Les || entre chacune de ces chaînes sont donc impératifs, c'est ce qui lui permet de comprendre ce que vous voulez faire de ces chaînes.

Je pense que vous devriez rechercher ces quelques points dans la doc (comprendre complètement ce que vous êtes en train de faire), je crains que sinon vous fabriquiez du code que vous ne contrôlez pas, avec les conséquences catastrophiques que ça peut avoir.


Marc.

Hors ligne

#27 03/06/2011 14:36:34

gleu
Administrateur

Re : fonction pl gsql

|| est l'opérateur de concaténation de chaînes de caractères.


Guillaume.

Hors ligne

#28 03/06/2011 14:43:07

Marc Cousin
Membre

Re : fonction pl gsql

Tiens, y a de l'echo smile

Plus sérieusement, j'ai l'impression que le bug de messages affichés en double et qui masquent les nouveaux messages est de retour, gleu…


Marc.

Hors ligne

#29 07/06/2011 10:16:52

lioneleder
Membre

Re : fonction pl gsql

ok, j'ai un autre soucis
quand je met un offset dans ma requète dynamique j'ai une erreur

execute 'select'  || x|| 'from' 'tab' where 'y' '=' quote_literal(val) offset 1 LIMIT 1 into c;

Hors ligne

#30 07/06/2011 10:17:53

lioneleder
Membre

Re : fonction pl gsql

j'ai une erreur du type l'argument de l'execute est null
merci pour vos réponses.

Hors ligne

#31 07/06/2011 10:19:22

Marc Cousin
Membre

Re : fonction pl gsql

Je présume que val vaut null ?

Si oui, quote_litteral vaudra null, ce qui fait que tout le reste vaudra null (la concaténation d'une chaîne avec une chaîne null retourne une chaîne null).

Remplacez quote_litteral par quote_nullable, qui est prévu pour gérer aussi les chaînes nulles dans les litteral.


Marc.

Hors ligne

#32 07/06/2011 10:21:21

lioneleder
Membre

Re : fonction pl gsql

non pas du tout

Hors ligne

#33 07/06/2011 10:23:21

Marc Cousin
Membre

Re : fonction pl gsql

Alors "x" ? C'est quoi ? Ça ne devrait pas être dans les quotes  ? Il manque plein d'opérateurs de concaténation derrière de toutes façons, puisque vous utilisez des quotes pour indiquer la fin des chaînes…


Marc.

Hors ligne

#34 07/06/2011 10:24:21

lioneleder
Membre

Re : fonction pl gsql

c'est le offset qui pose problème car lorsque je l'utilise dans une requète non dynamique donc sans execute ça marche.

Hors ligne

#35 07/06/2011 10:25:30

lioneleder
Membre

Re : fonction pl gsql

non c'est des variables , c'est les paramètres de ma fonctions(x,y,val)

Hors ligne

#36 07/06/2011 10:31:39

Marc Cousin
Membre

Re : fonction pl gsql

Non, le problème, c'est que vous faîtes un EXECUTE, qui attend une chaîne de caractère.

Et que :
'select'  || x|| 'from' 'tab' where 'y' '=' quote_literal(val) offset 1 LIMIT 1 into c;

est incompréhensible pour PostgreSQL: x est il une variable ? si oui jusque là c'est bon (mais dans ce cas, y n'es pas bon, puisque vous le mettez entre quotes)
ensuite, vous lui données une liste de chaînes de caractères : 'from' et 'tab', sans opérateur pour lui dire quoi en faire, puis un mot non protégé where, une nouvelle chaîne de caractère ('y'), encore une autre '=', à nouveau sans opérateur, un quote_literal qui est une fonction qui retourne une chaîne de caractère, toujours sans opérateur entre chaînes, et une série de mots-clés qui n'ont aucun sens pour execute, puisqu'il attend une chaine…

Comme dit plus haut, il faut vraiment que vous compreniez ce que vous êtes en train de faire avec ces chaînes de caractères, vous n'y arriverez pas sans.

Lisez déjà cette page sur la structure lexicale de SQL. Celle de PLPgSQL en est très proche.

http://docs.postgresql.fr/9.0/sql-syntax.html


Marc.

Hors ligne

#37 07/06/2011 10:31:43

lioneleder
Membre

Re : fonction pl gsql

pour ètre plus précis voila ma fonction

CREATE OR REPLACE FUNCTION test_multivaluate_dependancy(

left_attribut character varying,

right_attribut character varying,

val character varying,

val1 character varying,



tab character varying

)

returns integer as $$



DECLARE





i integer:=1 ;

i1 integer ;

bool boolean:=true ;

lio character varying;



BEGIN

	--EXECUTE 'select ' || left_attribut || '  from '||tab||' where ' ||right_attribut||  '=' || quote_literal(val)

	--into lio; 

		EXECUTE 'select '|| left_attribut || ' from ' ||tab||' where ' ||right_attribut||  '=' || quote_litera(val)
		||' and ' ||left_attribut||  '=' || quote_literal(val1) offset 1 limit 1

		into lio;

		--select * from tab offset 1 limit 1;

		return i;

END;

$$LANGUAGE 'plpgsql' 

SECURITY DEFINER;

Hors ligne

#38 07/06/2011 10:36:40

lioneleder
Membre

Re : fonction pl gsql

vous m'avez pas compris j'avais just posté la partie qui marchait pas mais  pas tout le code pour aller plus vite mais bon, j'ai lu la doc sur votre lien assez rapidement faute de temps mais pour mon erreur je sais pas quoi faire

Hors ligne

#39 07/06/2011 10:39:26

Marc Cousin
Membre

Re : fonction pl gsql

Vu que la fonction est en security definer, c'est une raison supplémentaire de bien comprendre ce que vous faîtes: la fonction va s'exécuter avec les droits du propriétaire de celle-ci. C'est une énorme faille de sécurité que vous préparez dans votre application. Aucun des paramètres de la fonction ne doit être utilisé sans fonction quote, dour commencer (vos attributs par exemple).

Qu'est-ce qui vous garantit que left_attribut ne va pas valoir quelque chose comme 'toto; CREATE TABLE tmp AS SELECT * FROM ma_table_super_secrete; GRANT ALL TO PUBLIC ON tmp;' ou quelque chose de ce genre ?

Pour revenir à votre problème, vous avez bien un problème d'opérateur de concaténation manquant.

Mais ce que vous êtes en train de faire est très mauvais en termes de sécurité. Il faut que vous preniez du recul et que vous étudiez la question (recherchez des docs sur l'injection SQL par exemple), vous ne pouvez pas mettre en place une fonction comme celle là.


Marc.

Hors ligne

#40 07/06/2011 10:45:16

lioneleder
Membre

Re : fonction pl gsql

Mon application c'est pour un projet à la fac donc pour le moment ça c'est pas bien grave les failles de sécurité, mais merçi pour vos conseil car c'est vrai que je n'avais pas pensé aux injections sql.

Hors ligne

Pied de page des forums