[info]Top 25 des erreurs de programmation

Hello tous,

Alors voilà, pour les (vrais) dévs qui parlent anglais, la liste est dispo directement sur le site Common Weakness Enumeration. J’ai traduit vite fait pour les (faux) dévs qui ne comprennent pas l’anglais. *

  • un troll se glisse dans ces 2 phrases, sauras-tu le découvrir? ^^

(A partir de http://www.sans.org/top25errors/)

[quote]Le Top 25 des erreurs se divisent en 3 catégories :
[ul]
[li]Interaction entre Composants non sécurisée (9 erreurs)[/li][li]Gestion des ressources dangereuse (9 erreurs)[/li][li]Défenses poreuses (7 erreurs)[/li][/ul]

Interaction entre Composants non sécurisée

CWE-20: Mauvaise vérification d’une Entrée [Improper Input Validation]
It’s the number one killer of healthy software, so you’re just asking for trouble if you don’t ensure that your input conforms to expectations… For more see: http://cwe.mitre.org/top25/#CWE-20
=> C’est l’erreur numéro UN des softs, donc vous cherchez vraiment la merde si vous ne vérifiez pas que les entrées sont conformes à ce qui est attendu…

CWE-116: Mauvais encodage ou échappement d’une Sortie [Improper Encoding or Escaping of Output]
Computers have a strange habit of doing what you say, not what you mean. Insufficient output encoding is the often-ignored sibling to poor input validation, but it is at the root of most injection-based attacks, which are all the rage these days… For more see: http://cwe.mitre.org/top25/#CWE-116
=> Les ordis ont l’étrange habitude de faire ce que vous dites, pas ce que vous voulez dire. Un encodage en sortie insuffisant est souvent le cousin éloigné oublié du faible contrôle à l’entrée, mais il est à la base de la plupart des attaques par injection, si populaires aujourd’hui…

CWE-89: Echec dans la garantie d’intégrité d’une requête SQL [Failure to Preserve SQL Query Structure (aka ‹ SQL Injection ›)]
If attackers can influence the SQL that you use to communicate with your database, then they can… For more see: http://cwe.mitre.org/top25/#CWE-89
=> Si des attaquants peuvent toucher au SQL que vous utilisez pour communiquer avec votre BdD, alors…

CWE-79: Echec dans la garantie d’intégrité d’une page Web [Failure to Preserve Web Page Structure (aka ‹ Cross-site Scripting ›)]
Cross-site scripting (XSS) is one of the most prevalent, obstinate, and dangerous vulnerabilities in web applications…If you’re not careful, attackers can… For more see: http://cwe.mitre.org/top25/#CWE-79
=> XSS est l’une des vulnérabilités les plus répandues, obstinées et dangereuses des applis web, Si vous ne faites pas gaffe, des agresseurs peuvent…

CWE-78: Echec dans la garantie d’intégrité d’une commande système [Failure to Preserve OS Command Structure (aka ‹ OS Command Injection ›)]
When you invoke another program on the operating system, but you allow untrusted inputs to be fed into the command string that you generate for executing the program, then you are inviting attackers… For more see: http://cwe.mitre.org/top25/#CWE-78
=> Quand vous appelez un autre programme de l’OS, mais autorisez des entrées non fiables dans la chaîne de commande que vous générez pour exécuter le programme en question, vous invitez les agresseurs à…

CWE-319: Transmission en clair d’une information sensible [Cleartext Transmission of Sensitive Information]
If your software sends sensitive information across a network, such as private data or authentication credentials, that information crosses many… For more see: http://cwe.mitre.org/top25/#CWE-319
=> Si votre logiciel envoie des infos sensibles à travers le réseau, telles que des données privées ou des certificats d’authentification, cette info traverse beaucoup…

CWE-352: Tromperie lors de l’exécution d’une demande distante [Cross-Site Request Forgery (CSRF)]
With cross-site request forgery, the attacker gets the victim to activate a request that goes to your site. Thanks to scripting and the way the web works in general, the victim… For more see: http://cwe.mitre.org/top25/#CWE-352
=> Grâce au CSRF, l’attaquant fait en sorte que la victime elle-même exécute la requête qui vient chez vous. Grâce au script et à la manière dont le web fonctionne en général, la victime …

CWE-362: Situation de compétition [Race Condition]
Attackers will consciously look to exploit race conditions to cause chaos or get your application to cough up something valuable… For more see: http://cwe.mitre.org/top25/#CWE-362
=> Tout agresseur va consciencieusement compter sur les situations de compétition pour provoquer un crash ou faire cracher quelque chose d’intéressant par votre application…

CWE-209: Message d’erreurs trop informatif [Error Message Information Leak]
If you use chatty error messages, then they could disclose secrets to any attacker who dares to misuse your software. The secrets could cover a wide range of valuable data… For more see: http://cwe.mitre.org/top25/#CWE-209
=> Si vos messages d’erreur sont trop verbeux, ils peuvent révéler des secrets à tout attaquant essayant de contourner l’utilisation normale de votre logiciel. Ces secrets peuvent couvrir une très grande variété de données de valeur…

Gestion des ressources dangereuse

CWE-119: Echec à restreindre les opérations dans les limites mémoires [Failure to Constrain Operations within the Bounds of a Memory Buffer]
Buffer overflows are Mother Nature’s little reminder of that law of physics that says if you try to put more stuff into a container than it can hold, you’re… For more see: http://cwe.mitre.org/top25/#CWE-119
=> Les dépassements de tampon sont une petite piqûre de rappel de Mère Nature à propos de la Loi de Physique qui dit que si vous essayez de mettre plus de choses dans un espace que ce qu’il peut contenir, vous…

CWE-642: Contrôle externe d’un état critique [External Control of Critical State Data]
There are many ways to store user state data without the overhead of a database. Unfortunately, if you store that data in a place where an attacker can… For more see: http://cwe.mitre.org/top25/#CWE-642
=> L’état d’un utilisateur peut être stocké de nombreuses façons sans avoir la charge d’une BdD. Malheureusement, si vous conservez cette donnée dans un lieu que l’attaquant peut…

CWE-73: Contrôle externe d’un nom de fichier ou chemin [External Control of File Name or Path]
When you use an outsider’s input while constructing a filename, you’re taking a chance. If you’re not careful, an attacker could… http://cwe.mitre.org/top25/#CWE-73
=> Quand vous utilisez une entrée extérieure pour construire un nom de fichier, vous prenez un risque. Si vous ne faites pas attention, un attaquant…

CWE-426: Chemin de recherche non fiable [Untrusted Search Path]
If a resource search path is under attacker control, then the attacker can modify it to point to resources of the attacker’s choosing. This causes the software to access the wrong resources at the wrong time… For more see: http://cwe.mitre.org/top25/#CWE-426
=> Si le chemin de recherche d’une ressource est sous le contrôle d’un attaquant, il peut alors le modifier pour présenter la ressource de son choix. Ce qui conduit le logiciel à accéder à la mauvaise ressource au mauvais moment…

CWE-94: Echec dans le contrôle de génération de code [Failure to Control Generation of Code (aka ‹ Code Injection ›)]
For ease of development, sometimes you can’t beat using a couple lines of code to employ lots of functionality. It’s even cooler when… For more see: http://cwe.mitre.org/top25/#CWE-94
=> Pour faciliter le développement, de temps en temps, il n’y a rien de mieux qu’un petit bout de code qui utilise plein de fonctionnalités. C’est encore plus cool quand…

CWE-494: Téléchargement de code sans contrôle d’intégrité [Download of Code Without Integrity Check]
You don’t need to be a guru to realize that if you download code and execute it, you’re trusting that the source of that code isn’t malicious. But attackers can perform all sorts of tricks… For more see: http://cwe.mitre.org/top25/#CWE-494
=> Pas besoin d’être un gourou du code pour savoir que si vous téléchargez du code et l’exécutez, vous êtes sûr que ce code n’est pas malveillant. Mais les attaquants ont plein d’astuces…

CWE-404: Libération de ressource incorrecte [Improper Resource Shutdown or Release]
When your precious system resources have reached their end-of-life, you need to… For more see: http://cwe.mitre.org/top25/#CWE-404
=> Quand vos ressources systèmes cherries ont atteint leur fin de vie, vous devez…

CWE-665: Initialisation incorrecte [Improper Initialization]
Just as you should start your day with a healthy breakfast, proper initialization helps to ensure… For more see: http://cwe.mitre.org/top25/#CWE-665
=> Tout comme vous devez commencer votre journée en prenant une bonne inspiration, une initialisation correcte aide à s’assurer que…

CWE-682: Calcul incorrect [Incorrect Calculation]
When attackers have some control over the inputs that are used in numeric calculations, this weakness can lead to vulnerabilities. It could cause you to make incorrect security decisions. It might cause you to… For more see: http://cwe.mitre.org/top25/#CWE-682
=> Si des attaquants peuvent avoir un peu de contrôle sur les entrées utilisées dans des calculs numériques, cela peut engendrer des vulnérabilités. Ca peut par exemple vous faire prendre de mauvaises décisions de sécurité…

Défenses Poreuses

CWE-285: Contrôle d’accès incorrect [Improper Access Control (Authorization)]
If you don’t ensure that your software’s users are only doing what they’re allowed to, then attackers will try to exploit your improper authorization and… For more see: http://cwe.mitre.org/top25/#CWE-285
=> Si vous ne vous assurez pas que les utilisateurs de votre logiciel ne font que ce pourquoi ils sont autorisés, des attaquants vont essayer d’exploiter vos mauvaises autorisations et…

CWE-327: Utilisation d’un algorithme cryptographique cassé ou dangereux [Use of a Broken or Risky Cryptographic Algorithm]
You may be tempted to develop your own encryption scheme in the hopes of making it difficult for attackers to crack. This kind of grow-your-own cryptography is a welcome sight to attackers… For more see: http://cwe.mitre.org/top25/#CWE-327
=> Vous pouvez être tenté de développer votre propre schéma de cryptage dans l’espoir que ça rende la vie plus difficile à un cracker. Malheureusement ette cryptographie-maison est du pain béni pour des crackers…

CWE-259: Mot de passé en dur [Hard-Coded Password]
Hard-coding a secret account and password into your software’s authentication module is… For more see: http://cwe.mitre.org/top25/#CWE-259
=> Coder en dur un compte et mot de passe secret dans le module d’authentification de votre logiciel est…

CWE-732: Affectation de permissions non sécurisée pour des ressources critiques [Insecure Permission Assignment for Critical Resource]
If you have critical programs, data stores, or configuration files with permissions that make your resources accessible to the world - well, that’s just what they’ll become… For more see: http://cwe.mitre.org/top25/#CWE-732
=> Si vous avez des programmes critiques, des données, des fichiers de configuration avec des permissions rendant ceux-ci accessible du monde entier – comment dire, c’est effectivement ce qu’ils deviendront…

CWE-330: Prédictibilité de variables supposées aléatoires [Use of Insufficiently Random Values]
If you use security features that require good randomness, but you don’t provide it, then you’ll have attackers laughing all the way to the bank… For more see: http://cwe.mitre.org/top25/#CWE-330
=> Si vous utilisez des modules de sécurité nécessitant de vrais aléas, mais que vous n’en fournissez pas, vous permettrez à vos agresseurs de bien rigoler pendant qu’ils se rendront à la banque…

CWE-250: Exécution avec des privilèges inutiles [Execution with Unnecessary Privileges]
Spider Man, the well-known comic superhero, lives by the motto « With great power comes great responsibility. » Your software may need special privileges to perform certain operations, but wielding those privileges longer than necessary can be extremely risky… For more see: http://cwe.mitre.org/top25/#CWE-250
=> Spider Man, notre araignée en collants préférée, aime à répéter : « Avec de grands pouvoirs viennent de lourdes responsabilités ». Votre logiciel peut avoir besoin de certains privilèges spéciaux pour effectuer certaines opérations précises, mais exercer ces privilèges plus longtemps que nécessaire peut être extrêmement dangereux…

CWE-602: Renforcement côté client d’une sécurité censée être côté serveur [Client-Side Enforcement of Server-Side Security]
Remember that underneath that fancy GUI, it’s just code. Attackers can reverse engineer your client and write their own custom clients that leave out certain inconvenient features like all those pesky security controls… For more see: http://cwe.mitre.org/top25/#CWE-602
=> Rappelez-vous que sous cette interface chiadée, il n’y a que du code. Des agresseurs peuvent désassembler votre client et écrire leur propre client en laissant de côté toutes ces fonctions un peu pénibles comme ces agaçants contrôles de sécurité par exemple…[/quote]

Ca fait du bien une piqûre de rappel de temps en temps. :slight_smile:

Dans la catégorie des “time waster” je rajoute:

  • je commence comme un bourrin et je recommence tout ensuite parce que finalement c’est pas aussi simple que je croyais (“on a jamais le temps de faire un truc mais on a toujours le temps de le refaire”)
  • je commence un truc propre et je le finis comme un gros cochon. L’important, c’est uqe ça marche, hin!
  • j’ai recommencé mille fois un truc parce que mes supérieurs / clients changent d’avis tous les jours
  • je ne commente pas les trucs “évidents”, sauf qu’ils sont plus si évidents que ça 2 mois après
  • “si je m’étais un peu mieux documenté j’aurais fait ça différement (mieux)”

Et aussi "j’ai passé une demi journée à programmer un truc alors qu’il existe déjà une fonction qui fait tout et qui le fait bien :slight_smile: "

[quote=« ethomit, post:3, topic: 48932 »]Et aussi "j’ai passé une demi journée à programmer un truc alors qu’il existe déjà une fonction qui fait tout et qui le fait bien :slight_smile: "[/quote]Je connais une variante : "j’ai passé une demi journée à programmer un truc, j’en suis fier, puis quelqu’un fait la même chose mais en plus propre :crying: ".

J’en ai des bons, récemment:

  • j’efface des éléments dans un array, tout en continuant d’itérer dessus (on peut y arriver, mais bon, copiez l’array les enfants. Vous sauvez des vies)
  • je ne mets pas le i++ dans la définition de la boucle for, mais sous un if. Donc si l’élément ne remplit pas la condition du if, boucle infinie.

Ca, c’est un collègue qui m’a donc forcé à rester jusqu’à 19h hier soir pour corriger (oui oui, deux en un).

edit: ooooh et celui de « tu restes encore 1h aujourd’hui aussi », le magnifique input en XML avec des caractères Windows ANSI… et évidemment les guillemets inclinés de Word, truc imbitable en UTF-8. :slight_smile:

Pour mes projets persos, j’ai plus le problème inverse en fait. Je commence comme un bourrin, excité par le challenge, et je finis pas toujours parce qu’en fait une fois le gros du problème réglé, finir les cas triviaux et le polish ca me soule. Par contre récemment j’ai re-re-re-re-(etc.) codé un nouveau moteur de blog pour mon site, en partant from scratch et… c’est exactement le même concept que le précédent, mais comme j’ai pris un chemin « différent », je m’en suis pas rendu comtpe tout de suite. Enfin, au moins c’est plus propre et mieux documenté maintenant.

:crying:

Oh ça va hein :slight_smile:

Ce lien était passé sur LinuxFR (mais merci pour la traduction quand même hein :)) et en lisant les commentaires on trouve aussi ce lien > http://freeworld.thc.org/root/phun/unmaintain.html
Histoire d’avoir du boulot dans 15 ans quand même…

[quote=“plouff, post:9, topic: 48932”]Ce lien était passé sur LinuxFR (mais merci pour la traduction quand même hein :)) et en lisant les commentaires on trouve aussi ce lien > http://freeworld.thc.org/root/phun/unmaintain.html
Histoire d’avoir du boulot dans 15 ans quand même…[/quote]C’est excellent, je me suis marré tout seul devant ça :[quote]Document the obvious
Pepper the code with comments like /* add 1 to i */ however, never document wooly stuff like the overall purpose of the package or method.[/quote]

c’est vrai que yen a des pas mal

When To Use i
Never use i for the innermost loop variable. Use anything but. Use i liberally for any other purpose especially for non-int variables. Similarly use n as a loop index.

Ola ola tout le monde

Pour ceux qui préfèrent en français, on a ça :
http://www.01informatique.fr/securite-118/…sa-45453/page2/