2015-10-14 2 views
1

Je construis une dynamique requête SQL en utilisant CFLoop. J'utilise CFSaveContent pour parcourir les variables et générer la requête, puis je l'exécute dans CFQuery en utilisant PreserveSingleQuotes. Cela fonctionne très bien, mais le problème avec cette méthode est que je ne peux pas utiliser CFQueryParam donc ma requête est vulnérable aux injections. Est-ce que je me demandais s'il y avait une solution de contournement pour ce problème?PreserveSingleQuotes et CFQueryParam

Mise à jour:

<cfsavecontent variable="sqlstring"> 
      SELECT id 
        ,(CASE 
         <cfloop query="qGetRules"> 
          WHEN val1 >=#qGetRules.equ# AND val2 >#arguments.leve# THEN 1 
         </cfloop> 
         ELSE 0 
         END) AS criteria 
      FROM mt4_users 
    </cfsavecontent> 


    <cfquery name="qGetEquity" datasource="mydatasource"> 
     #PreserveSingleQuotes(variables.sqlstring)# 
    </cfquery> 

donc sur cet exemple que vous pouvez voir que je ne peux pas utiliser cfqueryparam pour le arguments.leve car il se bloque sur PreserveSingleQuotes

+0

Avez-vous regardé les documents sur les [équivalents cfscript de cfquery et cfqueryparam] (https://helpx.adobe.com/coldfusion/cfml-reference/script-functions-implemented-as-cfcs/query. html)? – Leigh

+1

En théorie, nous validons tous les champs fournis par l'utilisateur tout le temps. S'appuyer uniquement sur le paramètre de requête pour la sécurité n'est pas aussi sûr que vous pourriez l'être. En outre, PreserveSingleQuotes a sa place, mais je n'ai jamais eu affaire avec succès aux apostrophes. –

+0

Puisqu'il s'agit d'un webservice pour mobile, je ne suis pas en mesure de valider la saisie de l'utilisateur (à côté de l'application mobile). Si quelqu'un renifle l'URL et essaie d'injecter le SQL, je vais devoir l'arrêter. – BlackM

Répondre

0

L'astuce consiste à utiliser le paramètre list de cfqueryparam. Il formatera correctement les données pour la requête, les guillemets échappés (si nécessaire) et tous.

Si la liste est des valeurs numériques (par exemple, dans un communiqué WHERE X IN (1,2,3,4)):

<cfqueryparam value="#arguments.foo#" cfsqltype="cf_sql_integer" list="true">

Si la liste est des valeurs de chaîne:

<cfqueryparam value="#arguments.foo#" cfsqltype="cf_sql_varchar" list="true">

Cela fonctionne aussi pour cfprocparam .

+0

Je ne vois rien dans la question qui suggère que l'OP génère simplement une liste de valeurs. En outre, le passage d'une liste de valeurs numériques à l'aide de 'cfprocparam' n'atteindra pas toujours l'objectif. Quand je fais cela avec sql-server, j'utilise des paramètres de valeur de table à la place. –