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?
Antwort
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.
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.
Ich würde fragen, was Sie denken, um zu gewinnen, indem Sie es nicht verwenden? –