本着我关于“常见的编程错误......避免”的其他问题的精神
ColdFusion程序员要避免哪些常见的编程错误?
答案 0 :(得分:27)
将<cffile>
上传路径设置为可通过Web访问的目录!!!
isStruct()
在isObject()
之前的一系列<cfif>
期望isStruct只捕获struct(cfc组件也从isStruct()返回True)
没有HtmlEditFormat()
忘了在CFC方法上添加output = false
未在<cfqueryparam>
<cfquery>
没有在方法中确定不那么明显的变量,如cfquery name或loop index
当他们需要的只是普通的HTML <cfform>
<form>
忘记了UrlEncodedFormat()
用户定义的网址
在不清理内容的情况下使用<cffeed>
信任isDate()
太多(任何数字都会返回true)
期望字符串比较区分大小写(IS和EQ运算符不区分大小写)
向SerializeJSON()
发送字符串“是”或“否”而不附加空格以保留字符串(否则SerializeJSON()
或DeserializeJSON()
会将其转换为“true”, “假”)
不将单身人士服务纳入申请范围
盲目地创造尽可能多的CFC,就像人们想要的一样在JAVA
将复杂的值/对象放入列表中(不能,列表只是一串逗号分隔的值)
编写将数组作为参数的函数,并修改该数组,期望该数组将被修改(CFML中的数组按值传递)
盲目地更改方法上的access="remote"
并期望它能够正常工作(当远程代理通常更合适时)
当CFML更合适时,在cfscript中使用大量WriteOutput()
当IsDefined()
通常可以更有效地执行此操作时,盲目地使用StructKeyExists()
盲目地使用Iif()
和De()
而不知道它们像评估一样令人讨厌()
更新onApplicationStart()中的一些代码,但没有看到刷新的差异(重新启动应用程序!)
<cfloop>
或<cfquery>
之外的“{”导致打开多个新的查询连接。 99%的情况下,在一个cfquery中执行多个语句以执行多个操作或一起执行UNION数据会更好。
当ExpandPath()
通常更好时,硬编码绝对路径
忘了在DSN中启用Unicode支持(Unicode变为'????')
未升级到最新的JRE和修补程序
滥用客户端范围并炸毁Windows注册表...
使用折旧/过时的功能/功能(即flash form,即flex 1.x alpha,cftable,Verity全文搜索等等)
将CFCATCH
作为参数类型Struct
传递给函数(CFCATCH
的行为类似于Struct
,但事实并非如此。只需将其作为类型'{传递{1}}“)。
不从ColdBox wiki阅读CFC Best Practices。
以.ASP(X)或.JSP或[插入网络技术]的思维方式购买总是更好..;)
不使用Any
并获得所有类型的浮点舍入错误,尤其是在计算金钱时。
答案 1 :(得分:3)
不恰当地使用#
SELECT *
不清除网址/表单输入
在生产环境中调试(即使输出被抑制)
答案 2 :(得分:2)
SQL Injection Attacks。似乎cfquery只是为了允许它们。所以你应该使用cfqueryparams。
答案 3 :(得分:2)
无耻地窃取亨利的格式......
答案 4 :(得分:1)
在Coldfusion中,默认情况下所有变量都是全局变量,除非使用var
关键字声明它们。 (有点类似于Javascript中的情况。)
因此,您必须记住函数中使用的var
每个变量,包括在cfquery
中使用的名称之类的内容name
,或者你可以使用这个技巧:
<cffunction name="MyFunction">
<cfset var Local = StructNew()>
<!--- Now anything Local. is automatically local --->
<cfset Local.x = 42>
<!--- Including cfquery name="" --->
<cfquery name="Local.Customers" datasource="some_datasource">
SELECT C.ID, C.Name
FROM Customers C
</cfquery>
</cffunction>
名称Local
没有什么神奇之处,只是惯例。虽然Coldfusion 9 will add an explict local scope,但如果你使用Local
,它可能会在时机成熟时轻松升级到CF9。
请注意,CFC的情况有所不同:在CFC中,variables
范围(“默认”范围)不像普通函数那样是全局的,而是存在于每个CFC实例中。因此,虽然忘记使用var
在CFC中并不像在顶级函数中那样危险,但最佳做法仍然是始终使用var
。
答案 5 :(得分:1)
未能阻止用户查看coldfusion错误。
将onError方法添加到顶级Application.cfc,以防止用户看到那些暴露内部工作(和失败)的详细转储消息。
<cffunction name="onError" returntype="void" output="true">
<cfargument name="exception" type="any" required="true" />
<cfargument name="eventname" type="string" required="true" />
varscoper也是一个很好的工具,可以自动检查组件中可变范围的遗漏。
答案 6 :(得分:0)
过度使用'查询查询'。也就是说,使用cfquery标记进一步过滤或排序查询结果。
这种类型的工作通常由数据库本身完成,特别是如果数据集很大。
答案 7 :(得分:0)
最大的错误之一就是不使用cfqueryparam
很糟糕:
SELECT UserName
FROM Customers
WHERE CustomerID = #URL.custid#
很好:
SELECT UserName
FROM Customers
WHERE CustomerID = <cfqueryparam value="#URL.custid#" cfsqltype="cf_sql_integer">`
犯这个错误会让你失去一个网站。
答案 8 :(得分:0)
将变量置于错误的范围内;即使您没有炸毁注册表或使服务器崩溃,也很容易通过将变量提升到您认为可能需要它们的最高范围来缓慢地从应用程序中消除性能,或者因为存储它而丢失信息一个范围,并尝试在不同的范围内访问它们。
使用cfcatch
而不捕获和/或传输有关错误的一些信息,以便找到并修复它。 (很难找到不会告诉你它发生的错误。)
在您需要listcontains()
时使用listfind()
。特别是如果列表包含数字。 listfind()
仅匹配列表中的整个项目; listcontains()
匹配项目的一部分。 (是的,我们曾犯过这个错误。)
有管理员权限: