2014-02-27 16 views
6

Ich verwende hauptsächlich CFQUERYPARAM, um SQL-Injection zu verhindern. Da Query-of-Queries (QoQ) die Datenbank nicht berührt, gibt es einen logischen Grund, CFQUERYPARAM in ihnen zu verwenden? Ich weiß, dass Werte, die nicht mit den cfsqltype und maxlength übereinstimmen, eine Ausnahme auslösen, aber diese Werte sollten zuvor bereits validiert werden und freundliche Nachrichten anzeigen (aus Sicht von UX).Gibt es einen logischen Grund, CFQUERYPARAM in Query of Queries zu verwenden?

+2

Ich würde fragen, was Sie denken, um zu gewinnen, indem Sie es nicht verwenden? –

Antwort

6

Hier ist eine Situation, wo es meiner Meinung nach einfacher ist.

<cfquery name="NoVisit" dbtype="query"> 
select chart_no, patient_name, treatment_date, pr, BillingCompareField 
from BillingData 
where BillingCompareField not in 
(<cfqueryparam cfsqltype="cf_sql_varchar" 
value="#ValueList(FinalData.FinalCompareField)#" list="yes">) 
</cfquery> 

Die Alternative wäre, QuotedValueList zu verwenden. Wenn jedoch in dieser Werteliste ein Apostroph enthalten ist, wird cfqueryparam diesen Apostroph verlassen. Sonst müsste ich.

bearbeiten beginnt hier

Hier ist ein weiteres Beispiel, bei dem nicht Abfrageparameter mit einem Fehler verursacht.

QueryAddRow(x,2); 
QuerySetCell(x,"dt",CreateDate(2001,1,1),1); 
QuerySetCell(x,"dt",CreateDate(2001,1,11),2); 
</cfscript> 

<cfquery name="y" dbtype="query"> 
select * from x 
<!--- 
where dt in (<cfqueryparam cfsqltype="cf_sql_date" value="#ValueList(x.dt)#" list="yes">) 
---> 
where dt in (#ValueList(x.dt)#) 
</cfquery> 

Der Code als wirft diesen Fehler geschrieben: erfolgreich

Query Of Queries runtime error. 
Comparison exception while executing IN. 
Unsupported Type Comparison Exception: 
The IN operator does not support comparison between the following types: 
Left hand side expression type = "DATE". 
Right hand side expression type = "LONG". 

Mit dem Abfrageparameter, kommentierte oben aus, führt der Code.

8

Da Query-of-Queries (QoQ) die Datenbank nicht berührt, gibt es einen logischen Grund, CFQUERYPARAM in ihnen zu verwenden? Tatsächlich berührt es die Datenbank, die Datenbank, die Sie gerade im Speicher gespeichert haben. Die Daten in dieser Datenbank könnten theoretisch noch durch irgendeine Art von Injektion von dem Benutzer manipuliert werden. Hat das Auswirkungen auf Ihre physische Datenbank? Nein. Beeinflusst das die Verwendung der Daten in Ihrer Anwendung? Ja.

Sie haben keine spezifischen Details angegeben, aber ich würde auf der sicheren Seite bleiben. Wenn ANY der Daten, die Sie verwenden, um Ihre Abfrage zu erstellen, vom Client kommt, dann verwenden Sie cfqueryparam in ihnen. Wenn Sie sicherstellen können, dass keines der Elemente in Ihrer Anfrage vom Client stammt, dann wäre es in Ordnung, das cfqueryparam nicht zu verwenden.

Nebenbei hilft die Verwendung von cfqueryparam auch bei der Optimierung der Abfrage für die Datenbank, obwohl ich nicht sicher bin, ob das für die Abfrage von Abfragen gilt. Es entgeht auch Zeichen für Sie wie Apostrophe.