2009-07-27 10 views
9

En el espíritu de mis otras preguntas sobre "errores de programación comunes ... para evitar"Errores comunes de programación para el programador ColdFusion para evitar?

¿Cuáles son algunos de los errores comunes de programación que debe evitar un programador ColdFusion?

+10

Hacer preguntas demasiado amplias en SO. ;) –

+1

Preguntas divertidas ... preguntas informativas ... ¡no demasiado amplias! Algunas de estas preguntas sobre "errores" están obteniendo buenas respuestas en ellas. Buena lectura. –

+5

@Greg Beech +1 - aunque debo admitir que programé con ColdFusion de CF 3 a 6.1 ... una vez que una persona encuentra un idioma/plataforma como C# y .NET es muy difícil mantener el interés en el mundo de ColdFusion. Pero mirando hacia atrás, uno debe admitir que ColdFusion 2.0 ofreció a los desarrolladores clásicos de ASP lo que .NET solo pudo ofrecer MUCHOS años después. Me atrevería a decir que ASP.NET se inspiró mucho en ColdFusion de la misma manera que C# se inspiró en Java. –

Respuesta

27
  • conjunto <cffile> carga ruta a un directorio accesible a través de la web, CF-enabled !!!

  • isStruct() antes isObject() en una serie de <cfif> 's que esperan isStruct sólo se capta estructura (componente CFC devuelve True de isStruct() también)

  • sin HtmlEditFormat() cuando se muestra el contenido generado por el usuario (XSS)

  • olvidó añadir salida = false en métodos CFC

  • no usar <cfqueryparam> dentro <cfquery>

  • no la determinación del alcance de variables no tan evidentes como el nombre cfquery o el índice de bucle en un método

  • uso <cfform> cuando todo lo que necesitan es HTML llano-vainilla <form>

  • olvidó de UrlEncodedFormat() URL definida por el usuario

  • uso <cffeed> sin desinfectar el contenido

  • confianza isDate() demasiado (cualquier número volvería verdadera)

  • esperan comparación de cadenas de mayúsculas y minúsculas (IS y operadores EQ distinguen entre mayúsculas y minúsculas)

  • cadenas que envían "sí" o "no" a SerializeJSON() sin añadiendo un espacio en blanco para preservar la cadena (de lo contrario SerializeJSON() o DeserializeJSON() las traducirá en "verdadero" y "falso")

  • no poner los servicios singletons en el ámbito de aplicación

  • ciegamente crear una s mucho CFC como uno quiere, como se haría en JAVA

  • poner compleja valor/objeto en una lista (no puede, lista es sólo una cadena de valores separados por comas) funciones

  • de escritura que lleva matriz como un argumento y modificar esa matriz esperando que array serán modificados (array en CFML se pasa por valor)

  • cambia ciegamente access="remote" en un método y esperan que funcionen (cuando proxy remoto es generalmente más apropiado)

  • use a mucha WriteOutput() en cfscript cuando CFML es más apropiado

  • utiliza ciegamente cuando IsDefined()StructKeyExists() general, puede hacerlo de manera más eficiente

  • utiliza ciegamente Iif() y De() sin saber que están tan desagradable como Evaluar()

  • actualizar algunos códigos en onApplicationStart() y no ver la diferencia en la actualización (¡reinicie la aplicación!)

  • <cfloop> o '' fuera de <cfquery> provocando que se abran nuevas conexiones de consulta. El 99% de las veces es mejor tener múltiples instrucciones dentro de una cfquery para realizar múltiples acciones, o para datos de UNION juntos.

  • hardcoding ruta absoluta cuando ExpandPath() es generalmente mejor

  • se olvidó de activar el soporte de Unicode en DSN (Unicode se convierte en '????')

  • no actualizar a la última JRE y revisiones

  • mal uso de alcance del cliente y volar registro de Windows ...

  • usos amortizan/obsoleta funciones/featu res (es decir flash forma también conocido como Flex 1.x alfa, búsqueda de texto completo cftable, Verity, etc ...)

  • pasar CFCATCH a una función como argumento de tipo Struct (CFCATCH se comporta como un Struct, pero no lo es. Sólo tiene que pasar como tipo 'Any').

  • No leyendo CFC Best Practices de ColdBox wiki.

  • de compra en el modo de pensar de .ASP (X) o .JSP o [tecnología web inserción] son ​​siempre mejor ..;)

  • No utilice PrecisionEvaluate() y conseguir todo tipo de punto flotante de error, especialmente cuando el redondeo calculando dinero.

+1

@Henry - ¡esta es una buena lista, hombre! Gracias. –

+0

sigue pensando qué añadir a la lista ... :) – Henry

+3

@Henry: Pequeño error tipográfico - es 'HTMLEditFormat()'. (Una de las razones para la vulgaridad de las vulnerabilidades XSS es que los nombres de las funciones de escape HTML son tan prolijo en todas partes:. 'Htmlspecialchars()' ', Server.HTMLEncode()', lo que sea lo general hago una función de contenedor para 'HTMLEditFormat() 'y llame a' h() ', que es muy conveniente. Junto con un contenedor para URLEncodedFormat llamado' u() '.) – Tomalak

3

El uso inapropiado de #

SELECT *

entradas

URL no fregar/forma

depuración en en entorno de producción (incluso si se suprime la producción)

2

SQL Injection Attacks. Parece que cfquery está hecho para permitirlos. Entonces debería usar cfqueryparams.

+0

¿Todo mejor ahora? –

+2

no cansa de hacer hincapié lo bien cfqueryparams son: cfqueryparam dejará de inyección SQL - el servidor SQL no se ejecutará el valor pasado a través de cfqueryparam – Antony

1

En Coldfusion, todas las variables son globales de forma predeterminada, a menos que se declaren con la palabra clave var. (Algo similar a la situación en Javascript.)

Así que o bien tienen que acordarse de varcada variable que se utiliza en una función, incluyendo cosas como nombres que se usan en un cfqueryname, o simplemente puede usar este truco:

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

No hay nada mágico en el nombre Local, es sólo convención. Aunque Coldfusion 9 will add an explict local scope, si usa Local probablemente facilitará la actualización a CF9 cuando llegue el momento.

Tenga en cuenta que la situación es un poco diferente para los CFC: en CFC, el alcance variables (el alcance "predeterminado") no es global como lo es para las funciones normales, sino que existe por instancia de su CFC. Así que, aunque olvidar usar var no es tan peligroso en un CFC como en una función de nivel superior, la mejor práctica es seguir usando var todo el tiempo.

+2

"no es tan peligroso"? En realidad, sigue siendo bastante peligroso ya que el código no es muy seguro para subprocesos. – Henry

+0

Bueno, sí, sigue siendo malo y nunca deberías hacerlo, pero los problemas estarán limitados a ese CFC, en lugar de afectar potencialmente cualquier función de nivel superior o página .CFM en tu aplicación CF. –

0

Uso excesivo de 'consulta de consulta'. Es decir, más filtrado o clasificación de resultados de consulta utilizando la etiqueta cfquery.

Este tipo de trabajo se hace a menudo mejor por la propia base de datos, en particular si el conjunto de datos es grande.

2

robar Desvergonzadamente formato de Henry ...

  • es más rápido y más preciso para comprobar booleano explícita en lugar de implícita; use < cfif query.recordCount GT 0 > en lugar de < cfif query.recordCount >
  • no use eval(), de(), o iif() ... alguna vez. siempre hay una forma de evitar estas funciones lentas
  • comprender estructuras, claves, valores y cómo acceder a los datos de consulta y estructura utilizando la notación de matriz. (esto generalmente superará su necesidad de evaluar())
  • No use signos de libra a menos que esté generando datos o creando una cadena (no haga esto: myFunction (arg = # myVar #))
  • lea y entienda la diferencia entre ESTE y el alcance VARIABLES en un CFC
  • evite el uso excesivo extremo de < cfsilent> cuando probablemente necesite usar un < cfcontent reset = "true" > justo antes de comenzar su salida (antes de doctype, xml declaration o <html>)
  • no caer ciegamente los valores de ColdFusion en un bloque de script HTML (JavaScript) sin necesidad de utilizar jsStringFo rmat()
  • si no está utilizando <CDATA> texto en el XML, es posible que desee utilizar xmlFormat() al crear un documento XML
  • no utilizan el registro de Windows para los datos de alcance del cliente. Usa la base de datos
  • si su arquitectura de TI lo permite, use datos de sesión en lugar de datos del cliente.
  • uso < cflock> correcta y consistente; datos compartidos se fuga en su aplicación.
  • si va a usar objetos Java, entienda los mensajes de error de Java (por ejemplo, 'método no se puede encontrar' puede no significar que el método no exista, significa que el método no existe para los argumentos que usted ' ve suministrado)
  • si tiene que leer archivos de gran tamaño, use las nuevas funciones de "Archivo" CF8 o transfiera la tarea a Java en CF6 & 7. < cffile> no es eficiente para archivos de gran tamaño.
  • entienden pass-by-reference y pass-by-value, y cómo esos conceptos funcionan en CF; específicamente cuando usa funciones para modificar documentos XML
  • como dijo Henry, siempre use < cfqueryparam>; También asegúrese de que está utilizando el parámetro CFSQLType correcto para su DBMS (por fecha, hora, fecha y hora, etc.)
  • no encadenar una serie de <cfif> y <cfelseif> bloques lógicos, utilice <cfswitch> y <cfcase> si tiene más de tres condiciones que necesita para manejar
  • más de una nota arquitectura: siempre hacer algún tipo de validación del lado del servidor para capturar los datos desagradables al lobo-camisa-llevando usuario puede usted estar pasando
  • última nota de arquitectura: deja que CF haga tu capa intermedia de recuperación y visualización de datos y deja que tu servidor web haga cosas del servidor web. e URLs SEO (estoy mirando a ti ColdCourse)
  • +0

    "no encadenar una serie de bloques lógicos y , use y si tiene más de tres condiciones que debe manejar" - ¡Esto es una afirmación definitiva! Creo que las declaraciones cfif/cfelseif/cfelse son más fáciles de leer porque hay menos etiquetas. –

    0

    Uno de los mayores errores que no se utilizan cfqueryparam

    Muy malo:

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

    Muy buena:

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

    Hacer ese error le costará un sitio web.

    0

    Poner variables en el ámbito incorrecto; incluso si no destruye el registro o interrumpe el servidor, es fácil agotar el rendimiento de su aplicación de forma lenta al aumentar las variables hasta el nivel más alto en el que cree que podría necesitarlas, o perder información porque la almacenó en un alcance e intentó acceder a ellos en un ámbito diferente.

    Utilizando cfcatch sin capturar y/o transmitir información sobre el error para que pueda ser encontrado y corregido. (Es difícil encontrar un error que no le indique que ocurrió.)

    Usando listcontains() cuando quiere listfind(). Especialmente si la lista contiene números. listfind() coincide solo con un elemento completo en una lista; listcontains() coincide con parte de un artículo. (Sí, hicimos este error una vez.)

    con acceso de administrador:

    • Dejando a los valores por defecto para una fuente de información creada en el servidor. Los "privilegios mínimos" también se aplican en el lado de la CF. no le dé más permisos de los que necesita específicamente. (OTORGAR, ALTERAR, REVOCAR, DEJAR ... en realidad no quiere que se marquen).
    • No marcando las casillas para recuperar todos los contenidos de un campo CLOB/BLOB cuando eso es lo que está esperando. (Fue muy interesante ver que se aplica a un campo en el que estábamos almacenando archivos PDF.)
    1

    No se puede evitar que los usuarios vean errores de ColdFusion.

    Agregue un método onError a un Application.cfc de nivel superior para evitar que los usuarios vean todos esos mensajes de volcado detallados exponiendo su funcionamiento interno (y fallas).

    <cffunction name="onError" returntype="void" output="true"> 
        <cfargument name="exception" type="any" required="true" /> 
        <cfargument name="eventname" type="string" required="true" /> 
    

    varscoper es también una gran herramienta para automatizar el control de omisiones de alcance variable en los componentes.

    http://varscoper.riaforge.org/

    Cuestiones relacionadas