代码之家  ›  专栏  ›  技术社区  ›  Joe Hildebrand

ColdFusion程序员要避免的常见编程错误?[关闭]

  •  9
  • Joe Hildebrand  · 技术社区  · 5 年前

    本着我关于“常见编程错误…避免“

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

    9 回复  |  直到 12 年前
        1
  •  27
  •   Henry    14 年前
    • 设置 <cffile> 上传路径到可访问的网站,启用CF的目录!!!!

    • isStruct() 之前 isObject() 在一系列 <cfif> 's应为ISstruct Only Catch结构(cfc组件也从ISstruct()返回true)

    • HtmlEditFormat() 显示用户生成的内容(XSS)时

    • 忘记在cfc方法中添加output=false

    • 不使用 <cfqueryparam> 里面 <cfquery>

    • 不限定方法中不太明显的变量,如cfquery name或loop index

    • 使用 <cfform> 当他们只需要普通的HTML <form>

    • 忘了 UrlEncodedFormat() 用户定义的URL

    • 使用 <cffeed> 不消毒内容

    • 信任 isDate() 太多(任何数字都将返回true)

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

    • 将字符串“是”或“否”发送到 SerializeJSON() 不附加空白以保留字符串(否则 SerialIZEXEN() DeserializeJSON() 将它们转换为“真”和“假”)。

    • 不将单例服务放在应用程序范围内

    • 盲目创造尽可能多的CFCs,就像在Java中一样

    • 将复杂值/对象放入列表(不能,列表只是逗号分隔值的字符串)

    • 编写将数组作为参数的函数,并修改该数组,以期望修改该数组(cfml中的数组按值传递)

    • 盲目改变 access="remote" 在一个方法上并期望它能够工作(当远程代理通常更合适时)

    • 当cfml更合适时,在cfscript中使用大量的writeOutput()。

    • 盲目使用 IsDefined() 什么时候? StructKeyExists() 通常可以更有效地完成任务

    • 盲目使用 Iif() De() 不知道他们和评估(evaluate)一样讨厌

    • 在applicationStart()中更新一些代码,但在刷新时看不到差异(重新启动应用程序!)

    • <cfloop> 或“”外部 <CFQueq & GT; 导致打开多个新查询连接。99%的时候,最好在一个cfquery中有多个语句来执行多个操作,或者将数据联合在一起。

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

    • 忘记打开DSN中的Unicode支持(Unicode变为'????“?”

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

    • 误用客户端作用域并炸毁Windows注册表…

    • 使用折旧/过时的功能/功能(即flash form aka flex 1.x alpha、cftable、verity全文搜索等)

    • 经过 CFCATCH 作为参数类型的函数 Struct ( CFCMAP 表现得像个 结构 但事实并非如此。把它作为类型传递 Any ''。

    • 不读书 CFC Best Practices 来自Coldbox wiki。

    • 以.asp(x)或.jsp或[insert web technology]的心态购买总是更好的。;)

    • 不使用 PrecisionEvaluate() 特别是在计算货币时,得到了各种浮点舍入误差。

        2
  •  3
  •   ale    15 年前

    不当使用#

    选择*

    不清除URL/表单输入

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

        3
  •  2
  •   JP Alioto    15 年前

    SQL Injection Attacks . 看起来像 cfquery 只是为了允许他们。所以你应该使用 cfqueryparams .

        4
  •  2
  •   Douglas    15 年前

    不知羞耻地窃取亨利的格式…

  • 检查显式布尔值而不是隐含的;使用<cfif query.recordcount gt 0>而不是<cfif query.recordcount>
  • 不要使用evaluate()、de()或iif()…曾经。总是有办法绕过这些缓慢的功能
  • 了解结构、键、值以及如何使用数组表示法访问查询和结构数据。(这通常可以解决您对evaluate()的需求)
  • 不要使用磅符号,除非您正在输出数据或以其他方式创建字符串(不要这样做:myfunction(arg=myvar))。
  • 阅读并理解这与CFC中变量范围的区别
  • 当您可能需要在开始输出之前(在doctype、xml声明或<html>之前)使用<cfcontent reset=“true”>时,请避免过度使用<cfsilent>。
  • 不要在不使用JSStringFormat()的情况下盲目地将ColdFusion值放到HTML脚本块(javascript)中。
  • 如果在XML中不使用<cdata>文本,则在创建XML文档时可能需要使用xmlFormat()。
  • 不要将Windows注册表用于客户端范围数据。使用数据库。
  • 如果您的IT架构允许,请使用会话数据而不是客户机数据。
  • 正确、一致地使用<cflock;共享数据 应用程序中存在泄漏。
  • 如果要使用Java对象,则理解Java错误消息(例如,“找不到方法”可能并不意味着该方法根本不存在,这意味着您所提供的参数不存在该方法)。
  • 如果你必须读取大文件,要么使用新的CF8“文件”函数,要么将任务移交给CF6和7上的Java。<cffile>对于大型文件来说效率低下。
  • 了解传递引用和传递值,以及这些概念在CF中的工作方式;特别是在使用函数修改XML文档时。
  • 如Henry所述,始终使用<cfqueryparam>;同时确保为DBMS使用正确的cfsqltype参数(用于日期、时间、时间戳等)
  • 不要将一系列<cfif>和<cfelseif>逻辑块链接在一起,请使用<cfswitch>和<cfcase>如果您有三个以上需要处理的条件
  • 更多的架构注意:总是做一些服务器端的验证来捕捉那些穿着狼衬衫的用户可能通过你的讨厌的数据。
  • 最后一个架构说明:让CF做数据检索和显示的中间层,让Web服务器做SEO URL之类的Web服务器工作(我看的是ColdCourse)
  •     5
  •  1
  •   Jason C    15 年前

    在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 所以如果你使用 局部的 到时候升级到CF9可能会比较容易。

    注意,CFC的情况略有不同:在CFC中, variables 作用域(“默认”作用域)不像普通函数那样是全局的,而是每个CFC实例都存在。所以当忘记使用 var 在CFC中不像在顶级功能中那样危险,最佳实践仍然在使用 var 总是。

        6
  •  1
  •   np0x    15 年前

    未能防止用户看到ColdFusion错误。

    向顶级application.cfc添加onerror方法,以防止用户看到详细的转储消息,从而暴露您的内部工作(和故障)。

    <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/

        7
  •  0
  •   AlexJReid    15 年前

    过度使用“查询查询”。也就是说,使用cfquery标记进一步筛选或排序查询结果。

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

        8
  •  0
  •   jyoseph    15 年前

    最大的错误之一是不使用cfqueryparam

    非常糟糕:

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

    非常好:

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

    犯这个错误会让你损失一个网站。

        9
  •  0
  •   Dave DuPlantis    15 年前

    将变量放在错误的范围内;即使您没有炸毁注册表或使服务器崩溃,也很容易将变量放在您认为可能需要它们的最高范围内,从而慢慢耗尽应用程序的性能,或者由于将变量存储在一个范围内并尝试在不同的范围内访问而丢失信息。

    使用 cfcatch 不捕获和/或传输有关错误的某些信息,以便找到并修复错误。(很难找到不告诉您发生了什么错误。)

    使用 listcontains() 当你想要的时候 listfind() . 尤其是如果列表中包含数字。 列表查找() 只匹配列表中的整个项目; ListC包容() 匹配项目的一部分。(是的,我们犯过一次错误。)

    具有管理员访问权限:

    • 保留服务器上设置的数据源的默认值。““最低权限”也适用于CF端;不要给它超出其特定需要的任何权限。(授予、更改、撤销、删除…你真的不想检查那些。)
    • 如果您希望从CLOB/BLOB字段中检索所有内容,则不要选中这些框。(看到这个应用于存储PDF的领域真的很有趣。)