2008-09-05 7 views
23

J'ai été chargé de passer en revue un certain nombre de sites ColdFusion qui ont récemment fait l'objet d'une attaque SQL Injection plutôt désagréable. Fondamentalement, mon travail consiste à ajouter des balises <cfqueryparam à tous les SQL en ligne. Pour la plupart je l'ai descendu, mais quelqu'un peut-il me dire comment utiliser cfqueryparam avec l'opérateur LIKE?cfqueryparam avec l'opérateur like dans ColdFusion

Si ma requête ressemble à ceci:

select * from Foo where name like '%Bob%' 

ce qui devrait ma <cfqueryparam> look tag comme?

Répondre

45

@Joel, je ne suis pas d'accord.

select a,b,c 
from Foo 
where name like <cfqueryparam cfsqltype="columnType" value="%#variables.someName#%" /> 
  1. Ne suggérez jamais à quelqu'un qu'ils "choisir étoiles." Mauvaise forme! Même pour un exemple! (Même copié à partir de la question!)

  2. La requête est pré-compilée et vous devez inclure le ou les caractères génériques dans le cadre du paramètre transmis à la requête. Ce format est plus lisible et fonctionnera plus efficacement. Lors de la concaténation de chaînes, utilisez l'opérateur d'esperluette (&), et non le signe plus. Techniquement, dans la plupart des cas, plus fonctionnera très bien ... jusqu'à ce que vous jetiez un NumberFormat() au milieu de la chaîne et commencez à vous demander pourquoi on vous dit que vous ne transmettez pas un nombre valide lorsque vous avez vérifié et tu es.

+0

Convenir ne pas sélectionner *, mais je qu'aligner la requête de l'échantillon dans la question initiale. –

+0

@Adam, saint cr @ p c'est une vieille réponse. Encore 100% correct cependant. Je l'ai trouvé très utile. –

-1
select a,b,c 
from Foo 
where name like <cfqueryparam cfsqltype="cf_sql_varchar" value="%Bob%" />; 
+1

Ceci est essentiellement la même que la réponse déjà acceptée? –