Esistono linguaggi che semplificano la comprensione dei principi di codifica sicura?

5

Sono interessato ad ampliare la mia conoscenza dei problemi di sicurezza: cose come buffer overflow, vulnerabilità delle stringhe di formato, ecc. Mi piacerebbe essere in grado di passare attraverso un linguaggio e comprendere le sue implicazioni sulla sicurezza e le insidie per ottenere una migliore comprensione di pratiche di codifica sicure in generale.

Ci sono alcune lingue che sono più favorevoli a un esperimento di apprendimento come questo? Ci sono lingue, a causa di astrazioni o complessità, dovrei evitare? Dove dovrei iniziare?

    
posta Atul Goyal 16.08.2011 - 21:34
fonte

4 risposte

5

Per ottenere una migliore comprensione di quali lingue come Java ti comprano in termini di sicurezza e gestione della memoria, lavora in C. L'unica cosa che guiderà il punto a casa più in profondità sarà lavorare in assembler¹. Anche se non assomiglia a ciò che Java fornisce, C ++ ti offre troppi strumenti per gestire il tipo di complessità che causa questi problemi, e la tentazione di usarli sarà troppo grande.

La gestione della memoria in C è molto laboriosa rispetto a Java e C ++. Non hai alcun tipo di garbage collection automatico, non hai distruttori espliciti per liberare risorse quando un oggetto esce dall'ambito, quindi devi tracciare manualmente ogni allocazione di memoria e abbinarlo con una deallocazione corrispondente. Gli array non sanno quanto sono grandi e non ci sono limiti di controllo, quindi devi tenere traccia di tutte queste dimensioni tampone e applicare manualmente quei limiti. C non fornisce molto nel modo di gestire le eccezioni (i segnali e setjmp/longjmp ne sono l'estensione, e questo non è proprio niente), quindi devi stare attento a come gestisci le condizioni di errore.

Se vuoi davvero apprezzare ciò che Java (o anche C ++) ti compra, implementa una libreria C che imita il comportamento della classe String di Java.

¹ Il meglio dei due mondi sarebbe lavorare in C e fare in modo che il compilatore scriva l'assembly generato in un file di output e lo studi.

    
risposta data 31.08.2011 - 00:38
fonte
8

Lo stile C ++ moderno ha una serie di costrutti che aiutano a mitigare i problemi di sicurezza. std::vector e string in particolare.

Quindi, consiglierei C.

Oppure, per momenti di divertimento, potresti scrivere alcuni programmi di assemblaggio.

    
risposta data 30.08.2011 - 23:10
fonte
3

La cosa fondamentale da capire è che la maggior parte dei problemi di sicurezza sono intrinsecamente di basso livello. C ++ è approssimativamente un superset di C, ma per essere veramente forzato per capire come funzionano le cose di basso livello, devi almeno dilettarti in C diritta, o scrivere codice intrinsecamente di basso livello (cose come la memoria allocatori o classi di stringhe) in C ++. Se impari solo il C ++ proveniente da uno sfondo di linguaggi di livello ancora più elevato, è probabile che proveresti a programmare in uno stile simile a Java con cui sei già a tuo agio, utilizzando molti oggetti e non toccare mai le funzionalità di livello inferiore ereditate da C, che sono quelli importanti se stai cercando di conoscere la sicurezza.

    
risposta data 30.08.2011 - 23:06
fonte
1

Non c'è motivo di scegliere C su C ++. Praticamente qualsiasi cosa che C può fare, C ++ può fare, ma meglio. Cose come la gestione automatica delle risorse e i modelli sono strumenti insostituibili. Dover imparare a free() è davvero irrilevante. Se scrivi codice C, non devi ancora scrivere il tuo malloc() o qualcosa del genere.

Non c'è nulla di specifico della lingua in merito alla sicurezza.

    
risposta data 30.08.2011 - 23:16
fonte

Leggi altre domande sui tag