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

时间:2009-07-27 23:08:14

标签: coldfusion

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

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

9 个答案:

答案 0 :(得分:27)

  • <cffile>上传路径设置为可通过Web访问的目录!!!

  • isStruct()isObject()之前的一系列<cfif>期望isStruct只捕获struct(cfc组件也从isStruct()返回True)

    < / LI> 显示用户生成的内容(XSS)时
  • 没有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)

无耻地窃取亨利的格式......

  • 检查显式布尔值而不是隐含更快更准确;使用&lt; cfif query.recordCount GT 0&gt;而不是&lt; cfif query.recordCount&gt;
  • 不要使用evaluate(),de()或iif()......这些慢功能总是有办法
  • 了解结构,键,值以及如何使用数组表示法访问查询和结构数据。 (这通常会满足您对evaluate()的需求)
  • 除非输出数据或以其他方式创建字符串,否则不要使用井号(请勿执行此操作:myFunction(arg =#myVar#))
  • 阅读并理解CFC中的THIS和VARIABLES范围之间的区别
  • 避免过度使用&lt; cfsilent&gt;当你可能需要使用&lt; cfcontent reset =“true”&gt;就在您开始输出之前(在doctype,xml声明或&lt; html&gt;之前)
  • 不要盲目地将ColdFusion值放入HTML脚本块(javascript)而不使用jsStringFormat()
  • 如果您不使用&lt; CDATA&gt; XML中的文本,您可能希望在创建XML文档时使用xmlFormat()
  • 不要将Windows注册表用于客户端范围数据。使用数据库。
  • 如果您的IT架构允许,请使用会话数据而不是客户数据。
  • 使用&lt; cflock&gt;正确而一致;共享数据泄漏到您的应用程序中。
  • 如果您要使用Java对象,请理解Java错误消息(例如,'找不到方法'可能并不意味着该方法根本不存在,这意味着该方法对于您的参数不存在)提供)
  • 如果你必须阅读大文件,要么使用新的CF8“文件”功能,要么将任务交给CF6上的Java&amp; 7.&lt; cffile&gt;对大文件效率不高。
  • 理解pass-by-reference和pass-by-value,以及这些概念在CF中的工作原理;特别是在使用函数修改XML文档时
  • 正如Henry所说,总是使用&lt; cfqueryparam&gt ;;还要确保为DBMS使用正确的CFSQLType参数(日期,时间,时间戳等)
  • 不要将一系列&lt; cfif&gt;链接在一起和&lt; cfelseif&gt;逻辑块,使用&lt; cfswitch&gt;和&lt; cfcase&gt;如果您有三个以上的条件需要处理
  • 更多的架构说明:总是进行某种服务器端验证,以捕捉穿着狼衫的用户可能会传递给您的讨厌数据
  • 最后一个架构说明:让CF做你的中间层数据检索和显示,让你的网络服务器做网站服务器之类的SEO URL(我在看你ColdCourse)
  • 答案 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也是一个很好的工具,可以自动检查组件中可变范围的遗漏。

    http://varscoper.riaforge.org/

    答案 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()匹配项目的一部分。 (是的,我们曾犯过这个错误。)

    有管理员权限:

    • 保留服务器上设置的数据源的默认值。 “最低特权”也适用于CF方面;不要给它任何比它特别需要的权限。 (GRANT,ALTER,REVOKE,DROP ......你真的不想要那些检查。)
    • 当您正在期待的时候,不检查从CLOB / BLOB字段中检索所有内容的框。 (看到应用于我们存储PDF的字段时,真的很有趣。)