Есть ли логическая причина использовать 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".
С параметром запроса, закомментированным выше, код выполняется успешно.