Fis*_*Ice 5 coldfusion cfqueryparam
我们虔诚地cfqueryparam在SQL查询中使用.
我的一些前辈在使用直接值而不是变量时似乎有点过分热心.
是不是
record_is_deleted_bt = <cfqueryparam cfsqltype="cf_sql_bit" value="0">
Run Code Online (Sandbox Code Playgroud)
矫枉过正?我的意思是,没有机会进行SQL注入,我不认为在这里使用绑定变量可以提高数据库性能.这样做是否合情合理
record_is_deleted_bt = 0
Run Code Online (Sandbox Code Playgroud)
?
cfqueryparam除了习惯使用它之外,在这种情况下使用是否有任何优势?有缺点吗?
不,这并不过分。cfqueryparam 的第一个工作是数据绑定。它有助于预防 sql 注入,这只是额外的好处。通过数据绑定准备好的语句执行速度更快。您认为它只是为了帮助预防 SQL 攻击,这是错误的。
重要提示:
我在 oracle 数据库上添加 @Dan Bracuk 提供的测试用例。
<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#.">
Run Code Online (Sandbox Code Playgroud)
总范围为 700 到 900 毫秒。无总计范围为 1800 到 4500 毫秒。没有总数总是至少是有总数的两倍。