Question Erreurs de programmation courantes à éviter pour le programmeur ColdFusion? [fermé]


Dans l'esprit de mes autres questions concernant "les erreurs de programmation communes ... à éviter"

Quelles sont les erreurs de programmation les plus courantes à éviter pour un programmeur ColdFusion?


9
2017-07-27 23:16


origine


Réponses:


  • ensemble <cffile> chemin de téléchargement vers un répertoire accessible sur le Web, compatible CF!

  • isStruct() avant isObject() dans une série de <cfif>isStruct n'attend que la structure (le composant cfc renvoie également True à partir de isStruct ())

  • non HtmlEditFormat() lors de l'affichage du contenu généré par l'utilisateur (XSS)

  • oublié d'ajouter la sortie = false sur les méthodes CFC

  • n'utilise pas <cfqueryparam> à l'intérieur <cfquery>

  • ne pas définir les variables pas si évidentes comme le nom de cfquery ou l'index de boucle dans une méthode

  • utilisation <cfform> quand tout ce dont ils ont besoin est HTML clair-vanille <form>

  • Oublié de UrlEncodedFormat() URL définie par l'utilisateur

  • utilisation <cffeed> sans désinfecter le contenu

  • confiance isDate() trop (n'importe quel nombre retournerait vrai)

  • attendez-vous à ce que la comparaison de chaînes soit sensible à la casse (les opérateurs IS et EQ ne respectent pas la casse)

  • envoyer des chaînes "oui" ou "non" à SerializeJSON() sans ajouter un espace pour préserver la chaîne (sinon SerializeJSON() ou DeserializeJSON() les traduira en "vrai" et "faux")

  • ne pas mettre les services singletons dans le champ d'application

  • créer aveuglément autant de CFC que l'on veut comme on le ferait en JAVA

  • mettre une valeur / objet complexe dans une liste (impossible, la liste est juste une chaîne de valeurs séparées par des virgules)

  • écrire des fonctions qui prennent un tableau en argument et modifier ce tableau en attendant que ce tableau soit modifié (le tableau dans CFML est transmis par valeur)

  • changements aveugles access="remote" sur une méthode et s'attendre à ce qu'elle fonctionne (lorsque le proxy distant est généralement plus approprié)

  • utiliser beaucoup de WriteOutput () dans cfscript lorsque CFML est plus approprié

  • utilise aveuglément IsDefined() quand StructKeyExists() peut généralement le faire plus efficacement

  • utilise aveuglément Iif() et De() sans savoir qu'ils sont aussi méchants qu'évaluer ()

  • mettre à jour du code dans onApplicationStart () et ne pas voir la différence lors de l'actualisation (redémarrer l'application!)

  • <cfloop> ou '' en dehors de <cfquery> provoquant l'ouverture de plusieurs nouvelles connexions de requête. 99% du temps, il est préférable d'avoir plusieurs instructions dans une même requête pour effectuer plusieurs actions, ou des données UNION ensemble.

  • chemin absolu de codage en dur quand ExpandPath() est généralement mieux

  • oublié d'activer le support Unicode dans DSN (Unicode devient '????')

  • ne pas mettre à niveau vers le dernier JRE et les correctifs

  • abuser de la portée du client et faire sauter le registre Windows ...

  • utilise des fonctions / fonctionnalités dépréciées / obsolètes (c'est-à-dire, forme Flash alias flex 1.x alpha, cftable, recherche de texte intégral Verity, etc.)

  • qui passe CFCATCH à une fonction comme type d'argument Struct  (CFCATCH se comporte comme un Struct, mais ce n'est pas. Il suffit de le passer en tant que type 'Any').

  • Ne pas lire Pratiques optimales des CFC à partir du wiki ColdBox.

  • acheter dans la mentalité de .ASP (X) ou .JSP ou [insérer la technologie Web] est toujours mieux ..;)

  • Ne pas utiliser PrecisionEvaluate() et obtenir toutes sortes d’erreurs d’arrondi en virgule flottante, en particulier lors du calcul de l’argent.


27
2017-07-28 00:14



Utilisation inappropriée de #

SELECT *

Ne pas supprimer les entrées URL / formulaire

Débogage dans l'environnement de production (même si la sortie est supprimée)


3
2017-07-28 00:20



Attaques par injection SQL. Il semble que cfquery est juste fait pour leur permettre. Donc, vous devriez utiliser cfqueryparams.


2



Voler sans vergogne le formatage d'Henry ...

  • il est plus rapide et plus précis de vérifier les valeurs booléennes explicites plutôt qu'impliquées; utilisez <cfif query.recordCount GT 0> au lieu de <cfif query.recordCount>
  • n'utilisez pas évaluer (), de () ou iif () ... jamais. il y a toujours un moyen de contourner ces fonctions lentes
  • comprendre les structures, les clés, les valeurs et comment accéder aux données de requête et de structure en utilisant la notation de tableau. (cela contournera généralement votre besoin d’évaluer ())
  • n'utilisez pas de signes dièse à moins que vous ne produisiez des données ou ne créiez une chaîne de caractères (ne faites pas ceci: myFunction (arg = # myVar #))
  • lire et comprendre la différence entre ce domaine et VARIABLES dans un CFC
  • évitez la surutilisation extrême de <cfsilent> lorsque vous devez probablement utiliser un <cfcontent reset = "true"> juste avant de commencer votre sortie (avant doctype, déclaration xml ou <html>)
  • ne déposez pas aveuglément les valeurs ColdFusion dans un bloc de script HTML (javascript) sans utiliser jsStringFormat ()
  • Si vous n'utilisez pas le texte <CDATA> dans votre XML, vous pouvez utiliser xmlFormat () lors de la création d'un document XML.
  • n'utilisez pas le registre Windows pour les données d'étendue du client. Utilisez la base de données.
  • Si votre architecture informatique le permet, utilisez les données de session au lieu des données client.
  • utiliser <cflock> correctement et uniformément; données partagées volonté fuite dans votre application.
  • Si vous envisagez d'utiliser des objets Java, comprenez les messages d'erreur Java (par exemple, «méthode introuvable» peut ne pas signifier que la méthode n'existe pas du tout, cela signifie que la méthode n'existe pas pour les arguments fournis)
  • Si vous devez lire des fichiers volumineux, utilisez les nouvelles fonctions CF8 "File" ou transférez la tâche à Java sur CF6 & 7. <cffile> est inefficace pour les fichiers volumineux.
  • comprendre les références et les valeurs et comment ces concepts fonctionnent dans les FC; en particulier lors de l'utilisation de fonctions pour modifier des documents XML
  • comme Henry l'a déclaré, utilisez toujours <cfqueryparam>; Assurez-vous également d'utiliser le paramètre CFSQLType correct pour votre SGBD (pour la date, l'heure, l'horodatage, etc.)
  • ne pas enchaîner une série de blocs logiques <cfif> et <cfelseif>, utilisez <cfswitch> et <cfcase> si vous avez plus de trois conditions à gérer
  • plus d'une note d'architecture: faites toujours une sorte de validation côté serveur pour récupérer les données désagréables que l'utilisateur qui porte le chandail peut vous transmettre
  • Remarque sur la dernière architecture: laissez CF faire votre couche intermédiaire de récupération et d’affichage des données et laissez votre serveur Web faire des choses de serveur Web telles que des URL de référencement (je vous regarde ColdCourse)

  • 2



    Dans Coldfusion, toutes les variables sont globales par défaut, sauf si elles sont déclarées avec le var mot-clé. (Un peu similaire à la situation en Javascript)

    Vous devez donc vous rappeler de var  chaque variable utilisée dans une fonction comprenant des choses comme les noms qui utilisent dans un cfquery  name, ou vous pouvez simplement utiliser cette astuce:

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

    Il n'y a rien de magique sur le nom Local, c'est juste la convention. Bien que Coldfusion 9 va ajouter une portée locale explicite, donc si vous utilisez Local cela facilitera probablement la mise à niveau vers CF9 le moment venu.

    Notez que la situation est un peu différente pour les CFC: dans les CFC, la variables scope (la portée "default") n'est pas globale comme pour les fonctions normales mais existe par instance de votre CFC. Donc, en oubliant d'utiliser var n'est pas aussi dangereux dans un CFC que dans une fonction de haut niveau, la meilleure pratique reste à utiliser var tout le temps.


    1



    Ne pas empêcher les utilisateurs de voir des erreurs de refroidissement.

    Ajoutez une méthode onError à une application.cfc de niveau supérieur pour empêcher les utilisateurs de voir ceux-ci pour des messages de vidage détaillés exposant votre fonctionnement interne (et vos échecs).

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

    varscoper est également un excellent outil pour automatiser la vérification des omissions de portée variable dans les composants.

    http://varscoper.riaforge.org/


    1



    Utilisation excessive de 'requête de requête'. C'est-à-dire un filtrage ou un tri supplémentaire des résultats de la requête à l'aide de la balise cfquery.

    Ce type de travail est souvent mieux exécuté par la base de données elle-même, en particulier si le jeu de données est volumineux.


    0



    L'une des plus grandes erreurs serait de ne pas utiliser cfqueryparam

    Très mauvais:

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

    Très bien:

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

    Faire cette erreur vous coûtera un site Web.


    0



    Placer les variables dans la mauvaise portée Même si vous ne faites pas sauter le registre ou que vous ne crassez pas le serveur, il est facile de réduire les performances de votre application en déplaçant les variables au niveau le plus élevé. une portée et a tenté d'y accéder dans un domaine différent.

    En utilisant cfcatch sans capturer et / ou transmettre des informations sur l'erreur afin qu'elle puisse être trouvée et corrigée. (Il est difficile de trouver une erreur qui ne vous dit pas que c'est arrivé.)

    En utilisant listcontains() quand tu veux listfind(). Surtout si la liste contient des chiffres. listfind() ne correspond qu'à un élément entier dans une liste; listcontains() correspond à une partie d'un article. (Oui, nous avons fait cette erreur une fois.)

    Avec accès administrateur:

    • Laisser les valeurs par défaut pour une source de données configurée sur le serveur. Les "privilèges minimum" s'appliquent également du côté des FC; ne lui donnez pas plus de permissions qu'il n'en a spécifiquement besoin. (GRANT, ALTER, REVOKE, DROP ... vous ne voulez pas vraiment les vérifier.)
    • Ne cochez pas les cases pour récupérer tout le contenu d'un champ CLOB / BLOB lorsque c'est ce que vous attendez. (C'était vraiment intéressant de voir que cela s'appliquait à un domaine dans lequel nous stockions des fichiers PDF.)

    0