Программисту или разработчику нельзя недооценивать важность создания безопасных приложений.
Безопасность программного обеспечения направлена на управление злонамеренными атаками путем выявления потенциальных уязвимостей в программном обеспечении и принятия необходимых мер предосторожности для их защиты.
Программное обеспечение никогда не может быть на 100% безопасным, поскольку разработчики могут игнорировать ошибку, вводить новые ошибки при исправлении существующих или вводить новые уязвимости посредством обновлений.
Однако есть два основных метода, которые могут использовать все разработчики программного обеспечения, чтобы гарантировать создание безопасного программного обеспечения. Речь идет о написании безопасного кода с самого начала и его эффективном тестировании.

Безопасность программного обеспечения играет чрезвычайно важную роль
Как написать безопасный код
При написании безопасного кода есть только одна задача — обработка ошибок. Если вы можете предвидеть каждую потенциальную ценность, которую пользователь может предоставить приложению, и сгенерировать ответ в программе для этого значения, то вы пишете безопасный код.
Это гораздо проще, чем вы думаете, поскольку все хорошие разработчики знают почти все о приложениях, которые они разрабатывают. Поэтому вы должны знать каждое значение, которое требуется вашему приложению для выполнения задачи (утвержденные значения), и понимать, что любые другие значения, которые могут существовать, являются неутвержденными значениями.
Напишите безопасный код
Предположим, вы хотите создать программу, которая принимает от пользователя только два целочисленных значения и выполняет над ними операцию сложения. Как хороший разработчик, вы теперь знаете все о своем приложении. Вы знаете все значения, которые будет принимать эта программа (целые значения), и вы знаете задачу, которую выполнит эта программа (операция сложения).
Пример создания программы на 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);
}
}
Приведенный выше код создает приложение, которое точно соответствует требованиям. При выполнении он выведет в консоли следующую строку:
Please enter your two integer values:
После этого приложение будет оставаться на паузе до тех пор, пока пользователь не введет в консоль два целочисленных значения (то есть введите первое значение, нажмите клавишу Enter и повторите).
Если пользователь вводит в консоль значения 5 и 4 , программа выдает следующий вывод:
The sum of the two integer values you entered: 9
Замечательно. Программа делает именно то, что должна делать. Однако если злонамеренный пользователь войдет и введет в ваше приложение нецелое значение, например «g», возникнет проблема. Это связано с тем, что в приложении нет кода, защищающего от неутвержденных значений.
На этом этапе ваше приложение выйдет из строя, создавая потенциальный шлюз в ваше приложение, чтобы хакеры точно знали, что делать дальше.
Пример безопасности программы
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);
}
}
Приведенный выше код безопасен, поскольку он выполняет обработку исключений. Поэтому, если вы введете нецелое значение, программа сгенерирует следующую строку кода:
Please enter a valid integer value.
Что такое обработка исключений?

Обработка исключений
По сути, обработка исключений — это современная версия обработки ошибок, в которой вы отделяете код обработки ошибок от обычного кода обработки. В приведенном выше примере весь обычный код обработки (или код, потенциально вызывающий исключение) находится в блоке try , а весь код обработки ошибок — в блоке catch.
Если вы внимательно посмотрите на приведенный выше пример, вы увидите, что есть два блока catch. Первый принимает аргумент InputMismatchException — это имя исключения, возникающего, если введено нецелое значение. Второй принимает аргумент Exception , и это важно, поскольку его цель — найти в коде любые исключения, которые разработчик не обнаружил во время тестирования.
Проверьте код
Никогда не следует недооценивать возможности тестирования и повторного тестирования кода. Многие разработчики (и пользователи приложений) находят новые ошибки после того, как программное обеспечение становится общедоступным.
Тщательное тестирование вашего кода гарантирует, что вы знаете, что ваше приложение будет делать в каждой мыслимой ситуации, и это позволяет защитить его от утечки данных.
Рассмотрим пример выше. Что, если после завершения вы будете тестировать приложение только с целочисленными значениями? Вы можете выйти из приложения, думая, что успешно определили все потенциальные ошибки, хотя на самом деле это не так.
Реальность такова, что вы не сможете выявить все потенциальные ошибки. Вот почему обработка ошибок работает в тандеме с тестированием вашего кода. Тестирование приведенной выше программы выявляет потенциальную ошибку, которая может возникнуть в конкретной ситуации.
Однако если существует какая-то другая ошибка, которая не появилась во время тестирования, то ее обработает второй блок catch в приведенном выше коде.
Безопасность базы данных
Если ваше приложение подключается к базе данных, лучший способ предотвратить доступ к этой базе данных — обеспечить безопасность всех аспектов приложения. Однако что, если ваше приложение разработано с единственной целью — предоставить интерфейс к указанной базе данных?
Здесь все становится немного интереснее. В своей самой простой форме базы данных позволяют пользователям добавлять, извлекать, обновлять и удалять данные. Система управления базами данных — это приложение, которое позволяет пользователям напрямую взаимодействовать с базой данных.
Большинство баз данных содержат конфиденциальные данные, поэтому для сохранения целостности и ограничения доступа к этим данным существует требование – контроль доступа.
Контроль доступа
Контроль доступа направлен на поддержание целостности базы данных путем определения типов людей, которые могут получить доступ к базе данных, и ограничения типа доступа, который они имеют. Поэтому хорошая система управления базами данных должна иметь возможность фиксировать, кто, когда и что делал, обращался к базе данных.
Это также может запретить зарегистрированным пользователям доступ или редактирование данных, с которыми им не разрешено взаимодействовать.