Jako programista lub programista nie możesz przeoczyć znaczenia tworzenia bezpiecznych aplikacji.
Bezpieczeństwo oprogramowania zajmuje się zarządzaniem złośliwymi atakami poprzez identyfikację potencjalnych luk w oprogramowaniu i podejmowanie niezbędnych środków ostrożności w celu ich ochrony.
Oprogramowanie nigdy nie będzie w 100% bezpieczne, ponieważ programiści mogą zignorować błąd, wprowadzić nowe błędy podczas naprawiania istniejących lub wprowadzić nowe luki w zabezpieczeniach poprzez aktualizacje.
Istnieją jednak dwie główne metody, z których mogą skorzystać wszyscy twórcy oprogramowania, aby mieć pewność, że tworzą bezpieczne oprogramowanie. Chodzi o pisanie bezpiecznego kodu od początku i skuteczne testowanie kodu.

Bezpieczeństwo oprogramowania odgrywa niezwykle ważną rolę
Jak napisać bezpieczny kod
Pisanie bezpiecznego kodu ma tylko jedno zadanie – obsługę błędów. Jeśli potrafisz przewidzieć każdą potencjalną wartość, jaką użytkownik może dostarczyć aplikacji i wygenerować odpowiedź w programie dla tej wartości, to piszesz bezpieczny kod.
Jest to znacznie prostsze, niż mogłoby się wydawać, ponieważ wszyscy dobrzy programiści wiedzą prawie wszystko o tworzonych przez siebie aplikacjach. Dlatego powinieneś znać każdą wartość wymaganą przez Twoją aplikację do wykonania zadania (wartości zatwierdzone) i zrozumieć, że wszelkie inne wartości, które mogą istnieć, są wartościami niezatwierdzonymi.
Napisz bezpieczny kod
Załóżmy, że chcesz utworzyć program, który przyjmie od użytkownika tylko dwie wartości całkowite i wykona na nich operację dodawania. Jako dobry programista wiesz już wszystko o swojej aplikacji. Znasz wszystkie wartości, jakie przyjmie ten program (wartości całkowite) i znasz zadanie, które ten program wykona (operacja dodawania).
Przykład tworzenia programu w Javie
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);
}
}
Powyższy kod tworzy aplikację dokładnie odpowiadającą wymaganiom. Po wykonaniu wyświetli w konsoli następujący wiersz:
Please enter your two integer values:
Aplikacja pozostanie wówczas wstrzymana do czasu, aż użytkownik wprowadzi do konsoli dwie wartości całkowite (co oznacza wprowadzenie pierwszej wartości, naciśnięcie klawisza Enter i powtórzenie).
Jeśli użytkownik wprowadzi w konsoli wartości 5 i 4 , program wygeneruje następujące dane wyjściowe:
The sum of the two integer values you entered: 9
To wspaniale. Program robi dokładnie to co powinien. Jeśli jednak wejdzie nikczemny użytkownik i wprowadzi do aplikacji wartość niecałkowitą, taką jak „g”, wystąpi problem. Dzieje się tak dlatego, że w aplikacji nie ma kodu chroniącego przed niezatwierdzonymi wartościami.
W tym momencie Twoja aplikacja ulegnie awarii, tworząc potencjalną bramę do Twojej aplikacji, dzięki czemu hakerzy będą dokładnie wiedzieć, co dalej robić.
Przykład bezpieczeństwa programu
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);
}
}
Powyższy kod jest bezpieczny, ponieważ obsługuje wyjątki. Dlatego jeśli wprowadzisz wartość niecałkowitą, program wygeneruje następujący wiersz kodu:
Please enter a valid integer value.
Co to jest obsługa wyjątków?
![Dlaczego bezpieczeństwo oprogramowania to umiejętność, którą powinien posiadać każdy programista? Dlaczego bezpieczeństwo oprogramowania to umiejętność, którą powinien posiadać każdy programista?]()
Obsługa wyjątków
Zasadniczo obsługa wyjątków to nowoczesna wersja obsługi błędów, w której oddziela się kod obsługi błędów od zwykłego kodu obsługi. W powyższym przykładzie cały normalny kod obsługi (lub kod potencjalnie powodujący wyjątek) znajduje się w bloku try , a cały kod obsługi błędów znajduje się w bloku catch.
Jeśli przyjrzysz się bliżej powyższemu przykładowi, zobaczysz, że istnieją dwa bloki catch. Pierwsza przyjmuje argument InputMismatchException - jest to nazwa wyjątku zgłaszanego w przypadku wprowadzenia wartości niecałkowitej. Drugi przyjmuje argument Wyjątek i jest to ważne, ponieważ jego celem jest znalezienie wyjątków w kodzie, których programista nie znalazł podczas testowania.
Sprawdź kod
Nigdy nie należy lekceważyć mocy testowania i ponownego testowania kodu. Wielu programistów (i użytkowników aplikacji) znajduje nowe błędy po udostępnieniu oprogramowania publicznie.
Dokładne przetestowanie Twojego kodu daje pewność, że wiesz, co Twoja aplikacja zrobi w każdej możliwej sytuacji, a to pozwala zabezpieczyć ją przed naruszeniami danych.
Rozważ powyższy przykład. Co się stanie, jeśli po zakończeniu będziesz testować aplikację tylko z wartościami całkowitymi? Możesz opuścić aplikację z myślą, że udało Ci się zidentyfikować wszystkie potencjalne błędy, podczas gdy w rzeczywistości tak się nie stało.
Rzeczywistość jest taka, że możesz nie być w stanie zidentyfikować wszystkich potencjalnych błędów. Dlatego obsługa błędów działa w połączeniu z testowaniem kodu. Testowanie powyższego programu ujawnia potencjalny błąd, który wystąpi w określonej sytuacji.
Jeśli jednak istnieje inny błąd, który nie pojawił się podczas testowania, poradzi sobie z nim drugi blok catch w powyższym kodzie.
Bezpieczeństwo baz danych
Jeśli aplikacja łączy się z bazą danych, najlepszym sposobem uniemożliwienia dostępu do tej bazy danych jest zapewnienie bezpieczeństwa wszystkich aspektów aplikacji. Co jednak, jeśli aplikacja została zaprojektowana wyłącznie w celu zapewnienia interfejsu do wspomnianej bazy danych?
Tutaj sytuacja staje się nieco bardziej interesująca. W swojej najbardziej podstawowej formie bazy danych umożliwiają użytkownikom dodawanie, pobieranie, aktualizowanie i usuwanie danych. System zarządzania bazami danych to aplikacja umożliwiająca użytkownikom bezpośrednią interakcję z bazą danych.
Większość baz danych zawiera dane wrażliwe, dlatego też, aby zachować integralność i ograniczyć dostęp do tych danych, istnieje wymóg – kontrola dostępu.
Kontrola dostępu
Kontrola dostępu ma na celu utrzymanie integralności bazy danych poprzez określenie typów osób, które mogą uzyskać dostęp do bazy danych i ograniczenie rodzaju dostępu. Dlatego dobry system zarządzania bazami danych musi być w stanie rejestrować, kto, kiedy i co zrobił, uzyskał dostęp do bazy danych.
Może również uniemożliwić zarejestrowanym użytkownikom dostęp lub edycję danych, z którymi nie są uprawnieni do interakcji.