Je ne suis pas un agent de sécurité. Je suis un programmeur qui doit maintenir un code sécurisé. C'est ce que j'appelle une pratique «fragile». Les points d'entrée sont dispersés dans un projet typique. Les trouver et les désinfecter tous est beaucoup de travail pour résoudre un seul problème, beaucoup de maintenance minutieuse et de tracas pour s'assurer qu'il reste efficace lorsque le code change, et plein d'hypothèses qui le rendent inefficace.
Utilisez plutôt des pratiques plus faciles à entretenir, en couches, contextuelles et qui résolvent un large éventail de problèmes. Vous n'avez alors pas besoin d'un filtrage coûteux et trop large.
Vous ne pouvez pas sécuriser les entrées si vous ne savez pas comment elles seront utilisées.
Disons que vous avez "sécurisé" votre système en supprimant tous les guillemets simples de toutes les entrées à travers le tableau. Super, vous êtes à l'abri d'un un type d'attaque par injection SQL. Que faire si cette entrée est utilisée dans une ...
- requête MySQL qui autorise les guillemets doubles
- Opération du système de fichiers
- Commande Shell
- Requête réseau
- Nom de la méthode
- Nom de la classe
-
eval
Chacun des ceux-ci ont des caractères spéciaux, des séquences d'échappement, des règles de citation et des pratiques de sécurité différents. Vous ne pouvez pas prédire comment votre entrée sera utilisée lorsqu'elle entrera. Essayer de supprimer tous les caractères spéciaux est de la folie et ne "résout" qu'une seule classe d'attaque.
Ou que faire si l'utilisateur est autorisé pour saisir une limite de pages. Cette limite est consciencieusement utilisée dans une requête paramétrée; pas d'injection SQL, yay! L'utilisateur entre 9999999999
et vous êtes maintenant ouvert à une attaque DOS.
Vous devez appliquer les mesures de sécurité appropriées au moment où l'opération potentiellement non sécurisée est effectuée. Cela prend en compte de nombreux facteurs propres à l'opération; nettoyer les caractères d'entrée n'en est qu'un.
Et tant que vous faites cela, vous pouvez aussi paramétrer vos requêtes. Ensuite, il n'est plus nécessaire de faire tout le travail et les dégâts des citations de décapage de couverture.
Filtrer toutes les entrées est difficile.
Il existe de très nombreuses façons d'obtenir et de transmettre des entrées dans un projet donné:
- entrées de formulaire
- urls
- noms de fichier
- contenu de fichier
- requêtes de base de données
- lecture réseau
- variables d'environnement
Ils sont généralement assez libres et peuvent utiliser de nombreuses bibliothèques différentes. Je ne connais aucun outil d'analyse statique qui vérifie que toutes les entrées potentiellement vulnérables ont été filtrées. Certaines langues ont un système taint
, mais elles sont difficiles à utiliser efficacement. Même si vous filtrez toutes les entrées, sans outil d'analyse statique, les entrées non filtrées reviendront au fur et à mesure du développement. Cela demande beaucoup d'efforts pour un résultat incomplet et coûteux à maintenir, ce qui nuit à la fonctionnalité.
En revanche, il n'y a généralement qu'une seule façon d'exécuter SQL dans un projet. Des outils statiques et d'exécution existent pour détecter automatiquement une injection SQL potentielle. Vous pouvez même interdire complètement les chaînes et exiger que toutes les requêtes soient des objets de requête SQL. Ces bonnes pratiques sont faciles à maintenir et de plus en plus intégrées dans les outils et les bibliothèques SQL.
Les "pare-feu" conduisent à une sécurité laxiste.
Semblable à la façon dont certains réseaux de bureau ont des pratiques très peu sécurisées car " nous avons un pare-feu ", l'équipe risque de devenir paresseuse pour sécuriser son code car" l'entrée est sûre ". L'entrée n'est certainement pas sûre.
Certains pourraient dire "pourquoi pas les deux?" Vous n'avez que quelques heures pour travailler sur un projet. Une pratique à faible efficacité et à entretien élevé est une perte de temps. Sa mise en œuvre et sa maintenance vous feront perdre un temps limité de pratiques plus efficaces et plus faciles à entretenir. Dans le pire des cas, vous passerez tellement de temps à jouer à whack-a-mole avec des entrées, et les problèmes ultérieurs causés par un filtrage trop agressif, que vous n'aurez jamais le temps de prendre des mesures de sécurité appropriées.
En bref, le filtrage des entrées est coûteux, fuit, difficile à maintenir, ne peut pas résoudre le problème et pourrait l'aggraver.