Pourquoi la sécurité logicielle est une compétence que tous les programmeurs devraient avoir
En tant que programmeur ou développeur, l'importance de créer des applications sécurisées ne peut être surestimée.
La sécurité logicielle traite de la gestion des attaques malveillantes en identifiant les vulnérabilités potentielles des logiciels et en prenant les précautions nécessaires pour s'en prémunir.
Un logiciel ne peut jamais être sécurisé à 100% car un développeur peut ignorer un bogue, créer de nouveaux bogues pour tenter de corriger des cas existants ou créer de nouvelles vulnérabilités via des mises à jour.
Cependant, il existe deux pratiques clés que tous les développeurs de logiciels peuvent utiliser pour s'assurer qu'ils créent un logiciel sécurisé: écrire du code sécurisé en premier lieu et tester efficacement votre code.
Comment écrire un code sécurisé
L'écriture de code sécurisé se résume à une chose: la gestion des erreurs. Si vous pouvez anticiper chaque valeur potentielle qu'un utilisateur pourrait nourrir votre application et créer une réponse dans votre programme pour cette valeur, alors vous écrivez un code sécurisé.
C'est beaucoup plus simple que vous ne le pensez car tous les bons développeurs savent presque tout sur les applications qu'ils développent. Par conséquent, vous devez connaître toutes les valeurs dont votre application a besoin pour exécuter une tâche (les valeurs approuvées) et comprendre que toutes les autres valeurs possibles existantes sont des valeurs non approuvées.
Rédaction de code sécurisé
Supposons que vous souhaitiez créer un programme qui n'accepte que deux valeurs entières d'un utilisateur et effectue une opération d'addition sur celles-ci. Avec cette seule phrase, comme un bon développeur, vous savez maintenant tout sur votre application. Vous connaissez toutes les valeurs que ce programme acceptera (valeurs entières) et vous connaissez la tâche que ce programme accomplira (une opération d'addition).
Création du programme dans l'exemple Java
import java.util.Scanner;
public class Main {
//The main function that executes the program and collects the two values
public static void main(String[] args) {
System.out.println("Please enter your two integer values: ");
int value1;
int value2;
Scanner input = new Scanner(System.in);
value1 = input.nextInt();
value2 = input.nextInt();
addition(value1, value2);
input.close();
}
//the function that collects the two values and displays their sum
private static void addition(int value1, int value2) {
int sum;
sum = value1 + value2;
System.out.println("The sum of the two integer values you entered: "+ sum);
}
}
Le code ci-dessus produit une application qui correspond précisément aux exigences. Lors de l'exécution, il produira la ligne suivante dans la console:
Please enter your two integer values:
L'application restera ensuite en pause jusqu'à ce que l'utilisateur entre deux valeurs entières dans la console (cela signifie taper la première valeur, appuyer sur la touche Entrée et répéter).
Si l'utilisateur entre les valeurs 5 et 4 dans la console, le programme produira la sortie suivante:
The sum of the two integer values you entered: 9
C'est bien; le programme fait exactement ce qu'il doit faire. Cependant, si un utilisateur malveillant arrive et entre une valeur non entière, telle que «g», dans votre application, il y aura des problèmes. En effet, aucun code de l'application ne protège contre les valeurs non approuvées.
À ce stade, votre application plantera, créant une passerelle potentielle dans votre application pour le pirate informatique qui sait exactement quoi faire ensuite.
Sécuriser votre exemple de programme
import java.util.InputMismatchException;
import java.util.Scanner;
public class Main {
//The main function that executes the program and collects the two values
public static void main(String[] args) {
try {
System.out.println("Please enter your two integer values: ");
int value1;
int value2;
//using the scanner class to read each input from the user,
//and assign it to is respective variable (throws an exception if the values are not integers)
Scanner input = new Scanner(System.in);
value1 = input.nextInt();
value2 = input.nextInt();
//calls the addition function and passes the two values to it
addition(value1, value2);
//closes the input stream after it has come to the end of its use
input.close();
//handle all the errors thrown in the try block
}catch(InputMismatchException e){
System.out.println("Please enter a valid integer value.");
}catch(Exception e) {
System.out.println(e.getMessage());
}
}
//the function that collects the two values and displays their sum
private static void addition(int value1, int value2) {
int sum;
sum = value1 + value2;
System.out.println("The sum of the two integer values you entered: "+ sum);
}
}
Le code ci-dessus est sécurisé car il effectue la gestion des exceptions. Par conséquent, si vous entrez une valeur non entière, le programme se terminera correctement tout en produisant la ligne de code suivante:
Please enter a valid integer value.
Qu'est-ce que la gestion des exceptions?
Essentiellement, la gestion des exceptions est la version moderne de la gestion des erreurs, dans laquelle vous séparez le code de gestion des erreurs du code de traitement normal. Dans l'exemple ci-dessus, tout le code de traitement normal (ou code qui peut potentiellement lever une exception) se trouve dans un bloc try , et tout le code de gestion des erreurs se trouve dans des blocs catch .
Si vous regardez de plus près l'exemple ci-dessus, vous constaterez qu'il y a deux blocs catch. Le premier prend un argument InputMismatchException ; c'est le nom de l'exception qui est levée si une valeur non entière est entrée. Le second prend un argument Exception , ce qui est important car son but est de détecter toute exception dans le code que le développeur n'a pas trouvée lors du test.
Tester votre code
Vous ne devez jamais sous-estimer la puissance du test et du retest de votre code avant l'empaquetage. De nombreux développeurs (et utilisateurs de leurs applications) trouvent de nouveaux bogues une fois que le logiciel est disponible au public.
Un test minutieux de votre code vous assurera que vous savez ce que fera votre application dans tous les scénarios imaginables, et cela vous permettra de protéger votre application contre les violations de données.
Prenons l'exemple ci-dessus. Que faire si, une fois terminé, vous testez l'application uniquement avec des valeurs entières? Vous pouvez vous éloigner de l'application en pensant que vous avez identifié avec succès toutes les erreurs potentielles alors que ce n'est pas le cas.
Le fait est que vous ne pourrez peut-être pas identifier toutes les erreurs potentielles; c'est pourquoi la gestion des erreurs fonctionne de pair avec le test de votre code. Le test du programme ci-dessus montre qu'une erreur potentielle se produira dans un scénario spécifique.
Cependant, si une autre erreur qui ne s'est pas produite lors du test existe, le deuxième bloc catch dans le code ci-dessus la gérera.
Sécuriser votre base de données
Si votre application se connecte à une base de données, le meilleur moyen d'empêcher l'accès à cette base de données est de vous assurer que tous les aspects de votre application sont sécurisés. Cependant, que se passe-t-il si votre application est conçue dans le seul but de fournir une interface à ladite base de données?
C'est là que les choses deviennent un peu plus intéressantes. Dans sa forme la plus élémentaire, une base de données permet à un utilisateur d'ajouter, de récupérer, de mettre à jour et de supprimer des données. Un système de gestion de base de données est une application qui permet à un utilisateur d'interagir directement avec une base de données.
La plupart des bases de données contiennent des données sensibles, par conséquent, pour maintenir l'intégrité et limiter l'accès à ces données, il y a une exigence: le contrôle d'accès.
Contrôle d'accès
Le contrôle d'accès cherche à maintenir l'intégrité d'une base de données en définissant le type de personnes qui peuvent accéder à une base de données et en restreignant le type d'accès dont elles disposent. Par conséquent, un bon système de gestion de base de données devrait être en mesure de consigner qui accède à la base de données, à quelle heure et ce qu'ils ont fait.
Il devrait également être en mesure d'empêcher un utilisateur enregistré d'accéder ou de modifier des données avec lesquelles il n'est pas autorisé à interagir.
La sécurité logicielle est une compétence cruciale pour tous les développeurs
Développer un bon logiciel est synonyme de s'assurer que votre logiciel peut résister à toute attaque malveillante. Ceci n'est réalisable que par l'écriture d'un code sécurisé, le test continu d'une application et le contrôle de qui a accès à vos données.
Maintenant que vous savez comment sécuriser votre logiciel, vous voudrez peut-être en savoir plus sur certaines étapes de développement logiciel.