2009-07-27 57 views
9

本着我关于“避免常见编程错误......”的其他问题的精神ColdFusion程序员要避免的常见编程错误?

ColdFusion程序员要避免哪些常见编程错误?

+10

询问SO过于宽泛的问题。 ;) – 2009-07-27 23:11:26

+1

有趣的问题......内容丰富的问题​​......不仅过于宽泛!其中一些“错误”问题正在得到很好的答案!良好的阅读。 – 2009-07-27 23:12:31

+5

@Greg Beech +1 - 虽然我必须承认我使用ColdFusion编程从CF 3到6.1 ...一旦有人发现像C#和.NET这样的语言/平台,就很难保持对ColdFusion世界的兴趣。但是回顾一下,必须承认ColdFusion 2.0为ASP经典开发人员提供了.NET在多年后才能提供的东西。我甚至会说,ASP.NET受到了ColdFusion的极大启发,就像C#受Java启发一样。 – 2009-07-27 23:31:31

回答

27
  • 设置<cffile>上传可访问Web的路径,启用CF的目录!!!

  • isStruct()在一系列<cfif>的期待isStruct isObject()之前仅捕获结构(CFC部件从isStruct(返回True)以及)显示用户生成的内容(XSS)

  • 没有HtmlEditFormat()

  • 忘记

  • 不使用<cfqueryparam>添加输出=假上CFC方法内<cfquery>

  • 没有作用域像CFQUERY名称或循环索引不那么明显变量的方法

  • 使用<cfform>时,他们需要的是纯香草HTML <form>

  • 忘记UrlEncodedFormat()用户自定义URL

  • 使用<cffeed>没有消毒的内容

  • 信任isDate()过多(任何数量将返回true)

  • 期望字符串比较是区分大小写(IS和EQ运营商是不区分大小写)

  • 发送串“是”或“否” SerializeJSON()无追加一个空白保留字符串(否则SerializeJSON()DeserializeJSON()将它们翻译为“真”和“假”)

  • 不把单身人士服务的应用范围

  • 盲目创建小号多氯氟烃作为一个想要像一个会在JAVA

  • 做到把复杂的值/对象到一个列表(不能,名单只是一个逗号分隔值的字符串),其采用

  • 写入功能数组作为参数和修改阵列期待该阵列将被修改(在CFML阵列由值来传递)

  • 盲目地改变上的方法access="remote"和期望它的工作(当远程代理一般是更合适)

  • 使用在CFSCRIPT很多WriteOutput()时CFML是比较合适的

  • 盲目使用IsDefined()StructKeyExists()一般可以更有效地

  • 盲目使用Iif()De()做到这一点不知道他们是为评估为讨厌的()

  • 更新onApplicationStart()中的一些代码,并没有看到刷新的区别(重新启动应用程序!)

  • <cfloop>或'<cfquery>以外的''导致多个新的查询连接被打开。 99%的时间最好在一个cfquery内部执行多个操作的多个语句,或者在一起执行UNION数据。

  • 硬编码绝对路径时ExpandPath()一般都比较好

  • 忘了DSN打开Unicode支持(统一变为 '????')

  • 没有升级到最新的JRE和修补程序

  • 滥用客户范围和炸毁的Windows注册表...

  • 用途贬值/过时的功能/ featu res(即闪存形式又称柔性1.x的α,CFTABLE,Verity的全文检索等)

  • 传递CFCATCH的功能参数类型StructCFCATCH表现得像Struct,但事实并非如此。只是通过它类型为'Any')。

  • 从ColdBox维基未阅读CFC Best Practices

  • 买盘.ASP(X)或.JSP或[插入网络技术]的心态总是会更好一些..;)

  • 不使用PrecisionEvaluate()并获得所有种类的浮点舍入误差尤其是当计算金钱。

3

不适当使用的#

SELECT *

未洗涤URL /表单输入

在生产环境(即使输出被抑制)调试上

1

在Coldfusion中,除非用关键字var声明所有变量,否则默认情况下所有变量都是全局变量。 (有点类似于JavaScript中的情况。)

所以,你要么必须记得在函数中使用var变量,包括之类的名字被用在cfqueryname,或者你可以只使用这一招:

<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实例中。因此,尽管在CFC中忘记使用var并不像在顶级功能中那样危险,但最佳做法仍然始终使用var

0

过度使用'查询查询'。也就是说,使用cfquery标签进一步过滤或排序查询结果。

这种类型的工作通常由数据库本身做得更好,特别是在数据集很大的情况下。

2

无耻偷亨利的格式...

  • 它更快,更准确的检查明确布尔而不是暗示;使用< cfif query.recordCount GT 0 >而不是< cfif query.recordCount >
  • 不要使用evaluate(),de()或iif()...永远。围绕这些缓慢功能总是有一种解决方法:理解结构,键,值以及如何使用数组表示法来访问查询和结构数据。 (这通常会满足您对评估()的需求)
  • 除非输出数据或以其他方式创建字符串,否则不要使用磅符号(不要这样做:myFunction(arg =#myVar#))
  • 阅读并理解CFC中THIS和VARIABLES作用域之间的区别
  • 避免极度过度使用< cfsilent>当您在开始输出之前(在doctype,xml声明之前)可能需要使用< cfcontent reset =“true”> ,或<html>)
  • 不要盲目地将ColdFusion值放入HTML脚本块(javascript)而不使用jsStringFo RMAT()
  • ,如果你没有在你的XML使用<CDATA>文本,您可能需要使用xmlFormat创建
  • 不使用Windows注册表的客户范围数据的XML文档时()。使用数据库。
  • 如果您的IT架构允许,请使用会话数据而不是客户端数据。
  • 使用< cflock>正确一致;共享数据将在您的应用程序中泄漏
  • 如果您要使用Java对象,了解Java错误消息(例如,'method can not be found'可能并不意味着该方法根本不存在,这意味着该方法对于您的参数不存在'提供)
  • 如果您必须读取大文件,请使用新的CF8“文件”功能或将任务交给Java上的CF6 & 7. < cffile>对于大文件而言效率低下。
  • 理解传递引用和传递值,以及这些概念如何在CF中工作;特别是在使用函数修改XML文档时,如亨利所述,始终使用< cfqueryparam>;如果使用函数修改XML文档
  • 。还请确保您使用的是正确CFSQLType参数为你的DBMS(日期,时间,时间戳等)
  • 不链接在一起CFIF >和<cfelseif>逻辑块一系列<,使用<cfswitch>和<cfcase>如果你有超过三个条件,你需要处理
  • 更多的架构注意:总是做一些服务器端验证赶讨厌的数据狼恤穿用户可通过您
  • 最后架构注意事项:让CF做你的中间层数据检索和显示,让你的网络服务器做webserver的事情ËSEO的网址(我看你ColdCourse)
  • 0

    一个最大的错误,将不使用cfqueryparam

    非常糟糕:

    SELECT UserName 
    FROM Customers 
    WHERE CustomerID = #URL.custid# 
    

    非常好:

    SELECT UserName 
    FROM Customers 
    WHERE CustomerID = <cfqueryparam value="#URL.custid#" cfsqltype="cf_sql_integer">` 
    

    犯这样的错误会让你成为一个网站。

    0

    将变量放在错误的范围内;即使你没有炸毁注册表或崩溃服务器,也很容易通过将变量冲击到你认为可能需要它们的最高范围,或者因为将它存储在一个范围,并试图在不同的范围内访问它们。

    使用cfcatch没有捕获和/或传输有关错误的一些信息,以便它可以找到并修复。 (很难找到一个不会告诉你它发生的错误。)

    使用listcontains()当你想要listfind()。特别是如果列表包含数字。 listfind()仅匹配列表中的整个项目; listcontains()匹配项目的一部分。 (是的,我们犯了这个错误一次。)

    具有管理员访问权限:

    • 离开默认值设置在服务器上的数据源。 “最低特权”也适用于CF方面;不要再给它任何比它特别需要的权限。 (GRANT,ALTER,REVOKE,DROP ...你并不想要那些检查。)
    • 不检查从CLOB/BLOB字段中检索所有内容的复选框,当这是你所期望的。 (看到适用于存储PDF的字段非常有趣。)
    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也是自动检查组件中变量范围遗漏的好工具。

    http://varscoper.riaforge.org/

    相关问题