9
votes

Erreurs de programmation communes pour le programmateur de ColdFusion à éviter?

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

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


19 commentaires

Demander des questions trop larges à ce sujet. ;)


Questions amusantes ... questions informatives ... pas seulement trop large! Certaines de ces questions "erreurs" obtiennent de bonnes réponses! Bonne lecture.


@Greg Beech +1 - Bien que je dois admettre que j'ai programmé avec ColdFusion de CF 3 à 6,1 ... Une fois qu'une personne trouve une langue / plate-forme comme C # et .net, il est très difficile de maintenir l'intérêt dans le monde de Coldfusion. Mais en regardant en arrière, il faut admettre que ColdFusion 2.0 offrait aux développeurs classiques ASP Qu'est-ce que .Net n'a pu offrir que plusieurs années plus tard. J'irais si loin de dire que Asp.net était grandement inspiré par Coldfusion de la même manière que c # a été inspiré par Java.


Drôle comme la même question exacte est révélée et fermée car la plate-forme n'est pas populaire. Le thread "des erreurs javascript communs" (juste en dessous de ce guichet automatique) a plusieurs upvotes.


Je parierais que le nombre de bowvotes a été généré par des personnes qui n'ont jamais entendu parler de Coldfusion ou n'ont jamais utilisé de froid. Très probablement étant évité non plus parce que c'est une froide, mais parce que j'ai posté plusieurs de ces questions aujourd'hui ... et les "pureistes" en ont assez de ce type de question. Pas de soucis!


La question "Ce qui vous frustre le plus au travail" est acceptable, mais une question liée à la colonne de froid dépose des votes et des votes pour fermer! Nous programmeurs sont folks!


... ou n'aime tout simplement pas que les gens jouent le système REP.


Alors, demandez à une bonne question est acceptable ... mais demandez 5 différentes bien que de bonnes questions dans la même veine que la première bonne question n'est pas? Trop drôle.


@ADEWREW - Si vous avez présenté ces questions, wiki de la communauté, vous n'auriez pas tant de flak. Comme c'est le cas, vous ne les faites que cw après que beaucoup de gens l'appellent et que vous choisissez essentiellement chaque langue que vous pouvez trouver et écrire une copie de la question populaire. C'est une agriculture de représentant, pure et simple. On dirait que vous avez même cessé de les changer en CW maintenant aussi.


J'ai seulement posé des questions concernant les langues / sujets que je suis intéressé. Je n'ai pas posé de question concernant Perl, XAML, HTML, LINGO, LISP, etc. Mais cela aurait pu. Merci pour votre dévouement. Cela a rendu ma journée agréable! : P


@zombat - j'ai fait cela un cw juste pour vous!


J'ai révoqué ma défense antérieure de ce fil après avoir remarqué combien d'entre eux sont ...


Je n'obtiens jamais bien ce que cw est utilisé pour


CW est utilisé pour réduire les gémissements des personnes qui souhaitent avoir pensé à demander une question à une question de reproduction. ;)


@zombat appelle l'acte de poser une bonne question, qui attire beaucoup de gens à réagir et à vérifier la question, "agriculture de représentants". J'aime ce terme si cela est censé être péjoratif ou non. Et si demande de nombreuses bonnes questions gagnant la question de la réputation du propriétaire de la question est une agriculture de représentant ... alors par tous les moyens appelle-moi un "représentant" agriculteur "!!! J'aime poser des questions et répondre aux questions. C'est amusant de voir toute l'interactivité créée par elle.


@ Peter Boughton: Non, il doit être utilisé lorsqu'il n'y a pas de réponse correcte pour une question (comme celle-ci). La FAQ a plus d'informations


Il y a toujours le potentiel d'une seule réponse correcte - même des questions qui sont un vote perpétuel peut avoir un résumé des réponses que la réponse acceptée. Bien sûr, l'absence de représentant de CW aide aux questions fondées sur le vote afin que la première personne de fournir une réponse commune ne reçoit pas de représentant indéterminé. Mais sinon c'est juste une solution de contournement pour quand il y a plusieurs contributeurs (à une question ou réponse), supprimez la complexité du calcul de la valeur des modifications et de la division du représentant.


Pour une question comme celle-ci, Henry mérite la réputation de relever la question et de la compilation d'une réponse complète longue.


Andrew Siemer a posé la question de la question. Le nom de Henry apparaît juste parce qu'il l'a modifiée.


9 Réponses :


3
votes

Utilisation inappropriée de #

Sélectionnez *

ne pas nettoyer les entrées URL / formulaire

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


0 commentaires

27
votes
  • SET Téléchargez le chemin d'accès à un répertoire Web accessible, CF-comptoir !!!

  • issatruc () avant isObject () dans une série de SSTRUCT STICCTURE (CFC Le composant renvoie aussi vrai de l'ISSTRUT ()

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

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

  • n'utilise pas intérieur

  • pas de variables non si évidentes telles que le nom cfquery ou l'index de boucle dans une méthode

  • Utilisez Quand tout ce dont ils ont besoin, c'est de plaine-vanille HTML

  • oublié à urlencodedformat () URL définie par l'utilisateur

  • Utilisez sans assainir le contenu

  • trust isdate () trop (tout numéro retournerait vrai)

  • Attendez-vous à une comparaison de chaîne sensible à la casse (IS et EQ Les opérateurs sont insensibles de cas)

  • Envoi de chaînes "Oui" ou "Non" à Serializejson () Sans Ajout d'un espacement pour préserver la chaîne (sinon Serializejson () ou DESERIALIZON () les traduira par "TRUE" et "FALSE")

  • ne pas mettre des services singletons dans la portée de l'application

  • Créez aveuglément autant de CFC comme on veut comme on veut faire en Java

  • Mettre la valeur complexe / objet dans une liste (Impossible, la liste n'est qu'une chaîne de valeurs séparées par des virgules)

  • Ecrire des fonctions qui prend une array comme un argument et modifie que la matrice s'attend à ce que la matrice soit modifiée (tableau dans la CFML est transmis par valeur)

  • changements aveuglély Access = "Remote" sur une méthode et attendez-vous à fonctionner (lorsque la proxy distante est généralement plus appropriée)

  • Utilisez beaucoup de writeOutput () dans cfscript lorsque CFML est plus approprié

  • utilise aveuglément isdefinefinine () lorsque structure de structure () peut généralement le faire plus efficacement

  • utilise aveuglément iif () et de () sans savoir qu'ils sont aussi méchants que l'évaluation ()

  • mettre à jour un certain code dans OnApplicationStart () et ne pas voir la différence sur Actualiser (redémarrer l'application!)

  • ou '' en dehors de provoquant l'ouverture de plusieurs nouvelles connexions de requête à ouvrir. 99% du temps, il est préférable d'avoir plusieurs déclarations à l'intérieur d'une cfquerie pour effectuer de multiples actions ou des données syndicales ensemble.

  • Chemin absolu de codage de code papier lorsque extpath () est généralement meilleur

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

  • ne pas passer à la dernière JRE et les Hotfixes

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

  • utilise des fonctions / fonctionnalités obsolètes / fonctionnalités (c'est-à-dire Formulaire Flash AKA Flex 1.x Alpha, CFTABLE, VERITY Texte complet de texte, etc.)

  • Passer cfcatch à une fonction de type d'argument struct ( cfcatch se comporte comme un struct , Mais ce n'est pas le cas. Il suffit de le transmettre comme tapez ' n'importe quel ').

  • ne lisez pas Les meilleures pratiques CFC de Coldbox Wiki.

  • L'achat dans la mentalité de .asp (x) ou .jsp ou [insérer la technologie Web] est toujours meilleur ..)

  • ne pas utiliser precisionevaluat () et obtenir toutes sortes d'erreur de point flottant d'arrondi, en particulier lors du calcul de l'argent.


7 commentaires

@HENRY - C'est une liste tout à fait de mon homme! Merci.


Toujours penser à quoi ajouter sur la liste ... :)


@HENRY: Petit typo - c'est htmleditformat () . (Une des raisons de la véracité des vulnérabilités XSS est que les noms de fonctions d'évasion HTML sont tellement verbeux partout: htmlspecialchars () , server.htmlencode () , vous le nommez. Habituellement Je fais une fonction d'emballage pour htmleditformat () et appelez ce h () , ce qui est très pratique. Avec un wrapper pour UrlenCodedFormat appelé u () .)


Oh, et +1. Très belle compilation de choses pour se tromper dans cf.


Je vois toujours cela dans le code hérité: exécuter ("formulaire # i #") au lieu de former ['compté # i #'].


J'espère que cela ne vous dérange pas que j'ai ajouté l'espacement et édité une orthographe, une excellente liste!


@éthyreal, pourquoi je voudrais dire? :) Merci d'être modifié. J'ai aussi ajouté 2 points supplémentaires sur le post.



2
votes

Attaques d'injection SQL . Il semble que CFQUERY est simplement fabriqué pour leur permettre. Vous devriez donc utiliser CFQUERYPARAMS .


1 commentaires

Je ne peux pas contrainter fortement la manière dont les bonsparyparams sont: cfqueryparam arrêtera l'injection SQL - le serveur SQL n'exécutera jamais la valeur passée via cfqueryparam



1
votes

Dans ColdFusion, toutes les variables sont globales par défaut, à moins qu'elles ne soient déclarées avec le mot-clé var . (Un peu similaire à la situation dans JavaScript.)

Vous devez donc vous rappeler var chaque variable utilisée dans une fonction, y compris des choses comme des noms qui utilisent dans un cfquery nom ou vous pouvez simplement utiliser ce truc: xxx

Il n'y a rien Magie sur le nom local , c'est juste une convention. Bien que Coldfusion 9 ajoutera un local explicatif Portée , donc si vous utilisez local , il facilitera probablement la mise à niveau vers CF9 lorsque le moment est venu.

Notez que la situation est un TAD différent pour les CFCS: dans CFCS , les variables la portée (la portée par défaut ") ne sont pas globales comme si elles sont destinées à des fonctions normales mais existent plutôt par exemple de votre CFC. Ainsi, alors que vous oubliez d'utiliser var n'est pas aussi dangereux dans un CFC, car il se trouve dans une fonction de haut niveau, la meilleure pratique est toujours d'utiliser var tout le temps.


2 commentaires

"Pas tout aussi dangereux"? Il est encore assez dangereux car le code n'est pas très sûr.


Eh bien, oui, c'est toujours le mal et vous ne devriez jamais le faire, mais les problèmes seront limités à ce CFC, au lieu d'affecter potentiellement une page de fonctionnement de niveau supérieur ou .CFM dans votre application CF.



0
votes

Surutilisation de la "requête de requête". C'est-à-dire que le filtrage ou le tri des résultats de la requête en utilisant la balise CFQUERY.

Ce type de travail est souvent mieux fait par la base de données elle-même, en particulier si l'ensemble de données est grand.


0 commentaires

3
votes

voler sans vergogénéiment Mise en forme de Henry ...

  • Il est plus rapide et plus précis de vérifier explicite booléen au lieu d'implicite; Utilisez au lieu de
  • Ne pas utiliser Evaluate (), DE () ou iIF () ... jamais. Il y a toujours un moyen de contourner ces fonctions lentes
  • Comprendre des structures, des clés, des valeurs et comment accéder aux données de la requête et de la structure à l'aide de la notation de la matrice. (Cela se déplacera généralement dans votre besoin d'évaluer ())
  • N'utilisez pas de panneaux de livre à moins que vous n'oubliez pas de données ou crée une chaîne (ne faites pas cela: mycée (arg = # myvar #))
  • lire et comprendre la différence entre cette portée et la portée des variables dans un CFC
  • Évitez la surutilisation extrême de lorsque vous devez probablement utiliser un juste avant de commencer votre sortie (avant la déclaration XML ou )
  • Ne déposez pas aveuglément des valeurs de ColdFusion dans un bloc de script HTML (JavaScript) sans utiliser JSStringFormat ()
  • Si vous n'utilisez pas le texte dans votre XML, vous pouvez utiliser XMLformat () lors de la création d'un document XML
  • N'utilisez pas de registre Windows pour les données de la portée du client. Utilisez la base de données.
  • Si votre architecture informatique permet, utilisez des données de session au lieu de données client.
  • Utilisez correctement et de manière cohérente; Données partagées fuites dans votre application.
  • Si vous allez utiliser des objets Java, comprenez les messages d'erreur Java (par exemple, «méthode ne peut pas être trouvée» peut ne pas dire que la méthode n'existe pas du tout, cela signifie que la méthode n'existe pas pour les arguments que vous " ve fourni)
  • Si vous devez lire des fichiers volumineux, utilisez les nouvelles fonctions de «fichier» CF8 ou la main sur la tâche à Java sur CF6 et 7. est inefficace pour les fichiers volumineux.
  • Comprenez la valeur de la transmission et de la valeur de transmission, et comment ces concepts fonctionnent dans cf; spécifiquement lors de l'utilisation de fonctions pour modifier les documents XML
  • Comme Henry a déclaré, utilisez toujours ; Assurez-vous également que vous utilisez le paramètre CFSQLTYPE correct pour votre SGBD (pour la date, l'heure, l'horodatage, etc.)
  • Ne pas chaînerez une série de blocs et logiques, utilisez et si vous avez plus de trois conditions, vous devez gérer
  • Plus d'une architecture Remarque: faites toujours une sorte de validation du côté serveur pour attraper les données méchantes que l'utilisateur Wolf-Shirt peut vous transmettre
  • Dernière architecture Remarque: Laissez CF faire votre couche médiane de récupération et d'affichage de données et laissez votre serveur Web servant des choses Web comme des URL de référencement (je vous regarde aurez-vous)

  • 1 commentaires

    "Ne pas chaîner une série de blocs et logiques, utilisez et si vous avez plus de trois conditions, vous devez gérer" - c'est un peu une déclaration définitive! Je pense que les déclarations CFIF / CFELSEIF / CFELSE sont plus faciles à lire car il y a moins de balises.



    0
    votes

    L'une des plus grandes erreurs n'utiliserait pas cfqueryparam

    très mauvais: xxx

    très bon: xxx < p> faire cette erreur vous coûtera un site Web.


    0 commentaires

    0
    votes

    Mettre des variables dans la mauvaise portée; Même si vous ne faites pas sauter le registre ou sur le serveur, il est facile de drainer lentement les performances de votre application en cogning les variables jusqu'à la portée la plus élevée dans laquelle vous pensez avoir besoin d'eux ou de perdre des informations parce que vous l'avez stockée une portée et essayé d'y accéder dans une autre portée.

    Utilisation de 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 qu'elle s'est produite.)

    Utilisation de ListContains () Quand vous souhaitez listfind () . Surtout si la liste contient des chiffres. listfind () ne correspond que d'un élément entier dans une liste; listContains () correspond à une partie d'un élément. (Oui, nous avons fait cette erreur une fois.)

    avec accès administrateur:

    • laissant les valeurs par défaut pour une source de données configurée sur le serveur. "Les moindres privilèges" s'appliquent également sur le côté CF; Ne vous donnez plus d'autorisations que cela n'a besoin que de spécifiquement besoin. (Grant, altérer, révoquer, tomber ... Vous ne voulez pas vraiment ces vérifications.)
    • Ne pas vérifier les cases pour récupérer tout le contenu d'un champ de clob / blob lorsque c'est ce que vous attendez. (C'était vraiment intéressant de voir qui s'appliquait à un champ dans lequel nous stockions des PDF.)

    0 commentaires

    1
    votes

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

    Ajouter une méthode onerror à une application de niveau supérieur.cfc Pour empêcher les utilisateurs de voir ces messages de députage détaillés exposant vos travaux intérieurs (et défaillances). P>

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


    0 commentaires