2014-02-27 6 views
6

В первую очередь я использую CFQUERYPARAM для предотвращения SQL-инъекций. Поскольку Query-of-Queries (QoQ) не касается базы данных, есть ли логическая причина использовать CFQUERYPARAM в них? Я знаю, что значения, которые не соответствуют cfsqltype и maxlength, генерируют исключение, но эти значения уже должны быть проверены до этого и отображать дружественные сообщения (с точки зрения UX).Есть ли логическая причина использовать CFQUERYPARAM в запросе запросов?

+2

Я бы спросил, что вы думаете получить, не используя его? –

ответ

6

Вот ситуация, когда это проще, на мой взгляд.

<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> 

Альтернативой будет использование QuotedValueList. Однако, если что-либо в этом списке значений содержит апостроф, cfqueryparam избежит его. В противном случае мне придется.

Edit начинается здесь

Вот еще один пример, где не с помощью параметров запроса вызывает ошибку.

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> 

Код, как написано выдает эту ошибку:

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". 

с параметром запроса, комментировал выше, код выполняется успешно.

8

Поскольку Query-of-Queries (QoQ) не касается базы данных, есть ли логическая причина использовать CFQUERYPARAM в них? Фактически, это касается базы данных, базы данных, которую вы в настоящее время сохранили в памяти. Данные в этой базе данных все же теоретически могут быть подделаны с помощью какой-то инъекции от пользователя. Это влияет на вашу физическую базу данных - нет. Это влияет на использование данных в вашем приложении - да.

Вы не указали никаких конкретных деталей, но я бы ошибался на стороне осторожности. Если ANY данных, которые вы используете для создания запроса, исходит от клиента, а затем используйте в них cfqueryparam. Если вы можете гарантировать, что ни один из элементов вашего запроса не приходит от клиента, я думаю, что было бы не использовать cfqueryparam.

Как в стороне, использование cfqueryparam также помогает оптимизировать запрос для базы данных, хотя я не уверен, что это верно для запроса запросов. Он также ускользает от персонажей для вас, как апострофы.