我们在SQL查询中虔诚地使用cfqueryparam
。
我的一些前辈在使用直接值而不是变量时似乎有点过分热心。
不
record_is_deleted_bt = <cfqueryparam cfsqltype="cf_sql_bit" value="0">
矫枉过正?我的意思是,没有机会进行SQL注入,我认为在这里使用绑定变量不会对提高数据库性能做任何帮助。
这样做是不合理的record_is_deleted_bt = 0
在这种情况下使用cfqueryparam
是否有任何好处,除了习惯使用它?有缺点吗?
答案 0 :(得分:4)
不,这不是矫枉过正。 cfqueryparam的第一份工作是数据绑定。它有助于sql注入预防只是附加奖金。通过数据绑定准备的语句执行得更快。你错误地认为它只能帮助防止sql攻击 重要提示: 我正在添加@Dan Bracuk在oracle db上提供的测试用例。
<cfquery name="without" datasource="burns">
select count(*)
from burns_patient
where patientid = 1
</cfquery>
<cfquery name="with" datasource="burns">
select count(*)
from burns_patient
where patientid = <cfqueryparam cfsqltype="cf_sql_integer" value="1">
</cfquery>
<cfscript>
TotalWithout = 0;
TotalWith = 0;
</cfscript>
<cfloop from="1" to="1000" index="i" step="1">
<cfquery name="without" datasource="burns" result="resultwithout">
select count(*)
from burns_patient
where patientid = 1
</cfquery>
<cfquery name="with" datasource="burns" result="resultwith">
select count(*)
from burns_patient
where patientid = <cfqueryparam cfsqltype="cf_sql_integer" value="1">
</cfquery>
<cfscript>
TotalWithout += resultwithout.executiontime;
TotalWith += resultwith.executiontime;
</cfscript>
</cfloop>
<cfdump var="With total is #TotalWith# and without total is #TotalWithout#.">
总计范围从700到900总毫秒。无总计范围为1800至4500毫秒。没有总数至少是总数的两倍。