Je commence à tout apprendre sur la sécurité et la programmation sécurisée. P>
J'ai toujours entendu parler de choses comme la vulnérabilité de tampon tampon. p>
Mais je ne sais pas encore comment ces vulnérabilités sont exploitées. Et comment pouvons-nous programmer suffisamment de manière sécurisée pour vous assurer que notre code est robuste. P>
Quand je dis tout cela, mes langages d'intérêt de programmation sont C et C ++. P>
Je cherche des didacticiels gratuits et des ressources sur Internet où je peux apprendre toutes les ins-n-hors de la programmation sécurisée. P> Li>
Les astuces spécifiques à la plate-forme sont également les bienvenues. Par exemple, je sais que dans la programmation de Windows, nous pouvons utiliser des fonctions telles que "MemMove_S" pour avoir un code sécurisé. Mais quels sont les équivalents de Linux / Unix? Ou est-ce le même là-bas? P> li>
Si un programmeur C / C ++ s'inquiète des piqûres formatées spécialement conçues (comme l'ancienne vieillie de la vieillissement de chaînes formatées PHP)? P> LI> ol>
Beaucoup de questions ici, mais une idée générale est que je veux apprendre une programmation sécurisée. P>
Merci pour chaque aide. P>
4 Réponses :
Je vais jeter un couple là-bas et faire ce wiki communautaire: p>
jamais, jamais, jamais utiliser Ne supposez pas qu'une chaîne est NULL terminée, sauf si vous savez vraiment vraiment que c'est. p> li>
Ne jamais déclarer un grand tampon à taille fixe et supposons simplement que ce sera "assez gros" pour ce que vous faites. p> li>
ol> obtient code>. p> li>
Pouvez-vous également partager ce qui ne va pas avec l'utilisation «obtient»?
@bits: Si vous ne savez pas ce qui ne va pas avec obtient () code>, je suggère fortement que vous obtenez l'un des ouvrages d'introduction énumérés sur Le Guide de livre C ++ définitif et apprendre C ++ avant de vous préoccuper de programmes d'écriture avec des exigences de sécurité critiques.
@James, j'ai possédé et lisez certains des livres mentionnés là-bas. Pour une raison quelconque, et oui, je ne sais pas ce qui ne va pas avec "Gets" du point de vue de la sécurité. Ce serait plus agréable si vous voulez simplement expliquer.
@bits - Le problème avec obtient code> est qu'il ne fait pas de vérification des limites. Si la quantité de données est supérieure à la taille du tampon que vous fournissez, ils déborde simplement du tampon.
Consultez Cert C Secure Coding Standard < / a> & Cert C ++ Standard Standard Standard . < / p>
assertions, assertions, assertions. S'il y a même la possibilité théorique que quelque chose ne soit pas correct, allez-y et affirme que c'est. Si quelque chose n'est pas tout à fait de la façon dont vous y attendiez, vous voulez que votre programme meure immédiatement et spectaculairement. Assurez-vous que vos assertions ne seront pas optimisées. P> li>
Soyez très prudent avec des tampons. Il y a certaines fonctions (par exemple obtient) qui écrivent dans un tampon sans savoir à quel point il est grand. N'utilisez pas ces fonctions. Vérifiez toujours vos tailles de tampon à droite où vous en avez besoin plutôt que de compter sur des valeurs précalisées. P> li>
Vérifiez toujours les codes de retour. Si vous ne pouvez rien faire de significatif sur une erreur (E.G. MALLOC), affirmez le succès, ou mieux, écrivez une fonction wrapper qui affirme le succès de manière à ne pas pouvoir renvoyer une valeur d'erreur et n'utilisez jamais l'original. Pour être extra-paranoïaque, votre compilateur émet un avertissement si vous ignorez implicitement une valeur de retour. P> LI>
traiter toutes les données entrant dans le programme comme une possible attaque malveillante, car c'est. Cela inclut les fichiers de configuration ainsi que l'entrée utilisateur. P> li>
"L'optimisation prématurée est la racine de tout mal". D'abord, faites-la bien. Ne pensez même pas à le rendre plus rapide sauf si un) vous avez absolument à et b) que vous avez profilé au code et savoir précisément ce que sont vos goulots d'étranglement. P> li>
Demandez à quelqu'un d'autre vérifier votre code. P> li> ol>
Ce ne sont qu'une poignée de points de départ. Écrire le code sécurisé est difficile. P>
1. et 3.: N'utilisez pas d'assertion pour les chèques d'exécution. Utilisez-le pour vérifier l'exactitude du programme, par exemple. Si une fonction s'attend à ce qu'un pointeur ne soit pas nul, affirmer est parfait pour cela, car c'est une condition préalable à la fonction et que le programmeur est responsable de remplir les conditions préalables. OTOH MALLOC Retour NULL est une erreur d'exécution pouvant survenir à tout moment sans votre contrôle. Il devrait donc être vérifié par code régulier. Si vous utilisez une emballage toujours réussie sans vous soucier de données utilisateur non enregistrées, alors si et quittez-la est aussi bonne.
Eh bien, si vous envisagez déjà MALLOC avec une sortie IF / SORTIE, vous pourriez aussi facturer une fonction dans une fonction. Si MALLOC échoue sur un système moderne, il n'y a généralement pas beaucoup que vous puissiez faire pour récupérer, et vous ne devriez pas attendre qu'il y ait une erreur pour enregistrer les données utilisateur en premier lieu.
Je parlais déjà de votre "fonction d'emballage qui affirme le succès". ;) Ce que vous pouvez faire avec un malloc défaillant dépend certainement de votre structure de traitement des erreurs et de votre stratégie de récupération - s'il y en a du tout, bien sûr. Que diriez-vous d'essayer de sauver des données non enregistrées dans un fichier de récupération de sinistre temporaire? Si cela fonctionne, il peut être restauré au début du programme suivant. Si cela échoue, aucun préjudice n'est fait pour les données existantes. Dépend de l'application, à coup sûr et à quel point vous considérez les données de l'utilisateur.
Vous pouvez certainement remplacer la sortie de votre wrapper Malloc avec un appel à une fonction de sauvegarde et de sortie. Mon point est que vous devriez avoir les données de l'utilisateur sauvegardées de toute façon, car a) votre code de traitement d'erreur doit être en soi une erreur d'erreur, et b) votre programme pourrait être obligé de quitter sans avoir la possibilité d'appeler votre code de récupération (par exemple , si vous vraiment i> manquez de mémoire et que le système d'exploitation tue le processus pour la récupérer). Essentiellement, au moment où les choses passent mal, il pourrait bien être trop tard pour enregistrer les données de l'utilisateur. Vous devez donc essayer de conserver votre programme dans un état où vous pouvez sortir en toute sécurité.
La programmation sécurisée englobe les pratiques qui réduisent les chances d'utilisation abusive par les responsables du code eux-mêmes. P>
Voici mes deux cents - évitez d'utiliser des pointeurs où vous le pouvez. À mon avis, un pointeur ne doit être utilisé que lorsqu'une valeur nulle a une signification particulière. Ce principe porte sur plusieurs idiomes codants p>
La corine de fond est, s'il y a des pointeurs impliqués, il y a de bonnes chances qu'il sera mal utilisé par une personne qui sera éventuellement hériter du code. P>
Bien 0A0d, c'était drôle. Je peux aussi Google, mais j'apprécierais certains de vos conseils personnellement appris également dans une programmation sécurisée. C'est ainsi que nous acquérons la connaissance, en partageant cela.
@ 0A0D - Et la règle numéro un de la sécurité est .. Ne cliquez pas sur les liens Tinyurl.com :)
Pourquoi recherchez-vous uniquement des ressources libres i>? Souvent, la meilleure information à avoir été trouvée dans des livres, qui ne sont généralement pas gratuites.
Décidez d'abord si vous souhaitez programmer dans C XOR C ++ B>. Malgré leurs similitudes syntaxiques, ce sont des langues très différentes et les réponses à votre question varieraient beaucoup selon lesquelles vous choisissez. En C ++, si vous vous tenez à des idiomes modernes et de haut niveau, il est effectivement difficile d'écrire un code non sécurisé.
Pourquoi feriez-vous cela comme "subjectif et argumentatif"? C'est BS! C'est une question légitime qui peut avoir des réponses factuelles. Que vous aimiez une question ou non n'est aucune raison de le fermer. b>
@SBI - principalement je veux apprendre C Programmation sécurisée basée sur C.
fermeture?? Au moins, quelqu'un pourrait expliquer quelque chose sur la façon d'éviter les exploits?
Dupliqué possible: Stackoverflow.com/ Questions / 2008173 / ...
@bits: supprimez ensuite la balise
c ++ code>. @James: C'est la première raison légitime que j'ai vue pour la fermeture de cette question. Et ce n'était même pas utilisé par les 4 électeurs rapprochés.