[resolu] problème d'injection SQL, doctrine orm

problème d'injection SQL, doctrine orm [resolu] - SQL/NoSQL - Programmation

Marsh Posté le 16-03-2011 à 11:25:21    

Bonjour, j'ai créé la requête suivante avec Doctrine ORM, qui permet d'afficher "les messages ayant certains tags".
Mysql retourne une erreur 'SQLSTATE[42000]: Syntax error or access violation: 1064 ...'
 
lorsque le tag contient le mot 'on', ou 'with'. Par exemple le tag 'ruby on rails'. Voici la requête :  
 

Code :
  1. $taginput = 'ruby on rails';
  2.  $i = 1;
  3.  $q = Doctrine_Query::create()
  4.   ->select('q.id')
  5.   ->from('Message q')
  6.   ->innerJoin("q.Tags t$i WITH t$i.name = '$taginput'" );
  7.  $data['messages'] = $q->execute()->getData();


 
Je ne comprend pas pourquoi Doctrine interprète $taginput quand celui contient le mot "on" ou "with", alors qu'il est entre guillemets. Il n'y a pas d'erreur SQL provoqué pour des tags comme "php", "jquery", etc.
Comment pourrait-je sécuriser mon code ?


Message édité par strim le 19-03-2011 à 12:18:14
Reply

Marsh Posté le 16-03-2011 à 11:25:21   

Reply

Marsh Posté le 16-03-2011 à 12:13:04    

Fais-lui afficher la requête générée, pour voir?


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 16-03-2011 à 12:57:27    

skeye a écrit :

Fais-lui afficher la requête générée, pour voir?


 
voici :  
 
SELECT q.id AS q__id FROM message q INNER JOIN message_tag_link q2 ON (q.id = q2.id_message) INNER JOIN tag t ON (rails')

Reply

Marsh Posté le 16-03-2011 à 13:50:31    

il manquerai pas une cote a la fin  ('rails') ?

Reply

Marsh Posté le 16-03-2011 à 17:17:16    

boomy29 a écrit :

il manquerai pas une cote a la fin  ('rails') ?


 
non il y en a bien un à la fin : '$taginput'

Reply

Marsh Posté le 16-03-2011 à 17:59:28    

et cette requête marche dans ton sql ?
 
elle sort quoi comme erreur sinon ?

Reply

Marsh Posté le 19-03-2011 à 12:17:51    

boomy29 a écrit :

et cette requête marche dans ton sql ?
 
elle sort quoi comme erreur sinon ?


 
Je viens de trouver la solution :  
 
la syntaxe correcte est :  
 
->innerJoin("q.Tags t$i WITH t$i.name = ?', $taginput );  
 
et non :  
 
->innerJoin("q.Tags t$i WITH t$i.name = '$taginput'" );  

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed