Есть ли логическая причина использовать CFQUERYPARAM в Query of Queries?

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

2 ответа

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

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

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

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

<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 избежит его. Иначе мне бы пришлось.

Редактирование начинается здесь

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

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

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

Другие вопросы по тегам