Повысьте безопасность наших приложений с помощью PHP

{title}

PHP появился как универсальный язык, который позволяет нам манипулировать данными, вводимыми через форму HTML, конечно, в его структуре есть больше инструментов и возможностей, чем просто это.
Универсальность и простота использования делают его одним из самых популярных языков в мире для веб-проектов, начиная от простых форм контактов и заканчивая основой для отличных приложений с самого начала, таких как Facebook .
Проблема универсальности и простоты использования заключается в том, что разработчик не обязан писать безопасный код, но с очень небезопасными функциями код будет работать идеально, и именно здесь возникают проблемы.

Безопасность веб-приложений


Безопасность веб-приложений - это то, чего не было с самого начала в PHP, однако это не делает его небезопасным языком, поскольку безопасность соответствует набору методов и стилей работы, которые программист должен знать, чтобы иметь возможность применять их к Ваши сценарии
рамки

Это правда, что с появлением фреймворков многие функции безопасности включены по умолчанию, однако не каждый разработчик использовал фреймворк в старых приложениях, и вполне возможно, что для некоторых функций использование фреймворка является излишним.
Ключами для обеспечения безопасности в наших приложениях с PHP являются: контроль и отладка данных, которые пользователь вводит в форму, проверка происхождения HTTP- запросов, которые получает наше приложение, и, наконец, избегание прямого выполнения инструкций через формы.

Фильтрация данных


В программировании есть правило, и оно универсально, то есть оно применяется не только к PHP, это то, что все данные, которые не генерируются приложением, потенциально злокачественны, это означает, что если это не то, что является результатом, который мы имеем запрограммирован мы не можем доверять.
Этот принцип применяется к значениям форм, файлам, базам данных, поэтому первым шагом к повышению нашей безопасности является фильтрация данных, если нам нужно взаимодействовать с этими элементами.
Мы собираемся перечислить некоторые из лучших практик, которые мы можем применять при фильтрации данных, вводимых в нашу форму:
Используйте списки допустимых значений

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

Может показаться заманчивым сделать очень интеллектуальную систему, которая исправляет данные с несоответствиями, но в конечном итоге это может принести нам проблемы и уязвимости, поэтому, если мы обнаруживаем что-то нерегулярное, мы не должны обрабатывать это.
Использовать соглашение об именах

С помощью этой практики мы можем отличить данные и безопасные значения от тех данных и значений, которые были введены пользователем, и этим мы будем усиливать в процессе программирования использование первых для обработки.

Типы фильтрации


Есть два типа фильтрации, которые мы можем сделать: первый - это значения, которые мы знаем, а второй - значения, которые мы не знаем.
Первое очень легко выполнить, мы должны выполнять только подпрограммы со списками известных элементов и сравнивать их, однако это является громоздким и трудным для выполнения в больших приложениях. Второе включает создание подпрограмм, которые оценивают структуру значения, и если оно соответствует тому, что мы считаем безопасным, мы позволяем перейти к обработке, в противном случае мы выдаем ошибку, которая носит динамический характер, это рекомендуемый формат.
Давайте посмотрим ниже пример кода первого типа фильтрации:
В следующем коде мы увидим, как мы создаем форму, которая имеет элемент select для выбора пользователем цвета, так как пользователю не нужно записывать напрямую вводимые данные, мы можем ошибиться, не проверив информацию, но это только делает у нас есть дыра в безопасности, потому что с помощью формы, которая использует те же имена, мы можем получать потенциально опасную информацию.
Вот почему после того, как значение формы отправлено через POST, наш скрипт оценивает возможные значения, и в случае, если оно является одним из ожидаемых, мы передаем его в нашу схему безопасных значений, как показано ниже.

{title}


С этим мы решили проблему простым способом, однако, если бы в списке вместо трех цветов было сто, история простоты была бы другой.
В следующем примере мы будем динамически проверять поле, введенное пользователем соответствующим образом, для этого мы должны использовать регулярные выражения и таким образом избегать ввода символов, которые подвергают нашу обработку риску, также оценивать размер ввода и, таким образом, избегать переполнение или перегрузка данных нашего типа при обработке программы. Давайте посмотрим код на изображении:

$config[ads_text5] not found

{title}


Здесь ключом к достижению проверки является правильное знание того, что мы хотим обработать, например, в случае имени пользователя, обычно то, что мы просим, ​​это буквенно-цифровые символы и дефисы, поэтому в регулярном выражении, которое мы проверяем, нам также нужно, чтобы оно было больше что 0 символов и максимум 32, если введенный пользователем выполняет все это, проходит проверку, лучше всего то, что это работает со значением, как со сто, так как оно полностью динамично.

Защита от скриптов с других сайтов


Другая угроза, от которой мы должны защищаться, - это выполнение сценариев с других сайтов, благодаря AJAX мы можем отправлять формы от клиента к маршруту, включая тип запроса и значения, которые мы хотим.
слабость

$config[ads_text5] not found

Этот тип слабости позволяет очень легко проверять нашу форму и просматривать наши поля, где при владении этими именами и методом HTTP пытаются отправлять небезопасные значения, чтобы избежать этого, мы должны применять методы, которые позволяют нам проверять, откуда поступил запрос и, если он безопасно разрешить его выполнение, в противном случае избегайте продолжения пути в нашей программе.
Чтобы избежать этой проблемы, необходимо создать систему токенов и сеансов, чтобы при отправке формы мы оценивали, совпадает ли сеанс с безопасным, и, таким образом, злоумышленник не может продолжить работу.

SQL-инъекция


Основная цель злоумышленника заключается в том, чтобы иметь возможность вставить свой код в нашу среду, для этого они используют инъекции кода SQL, эта атака известна как инъекция SQL, где при небезопасных формах и неадекватной обработке мы можем получать инструкции SQL напрямую без пределы. Например, если наша оценка SQL следующая в нашем скрипте PHP :

$config[ads_text5] not found

{title}


Мы можем использовать любого пользователя системы в качестве имени пользователя, а для пароля мы используем два сценария «-», с помощью которых мы можем без проблем передать защиту, так как два сценария являются комментарием SQL и, следовательно, пароль не будет оцениваться.
Правильный способ оценки SQL-кода, созданного пользователем, состоит в удалении специальных и опасных символов, только путем оценки безопасных выражений. Давайте рассмотрим пример ниже, как избежать предыдущего случая:
Первое, что нужно сделать, - это очистить данные, то есть предотвратить их чистую передачу из формы в наш SQL ; Во-вторых, мы должны оценить, что если два значения соответствуют предоставлению доступа, но последнее соответствует логике каждого из них, давайте посмотрим на изображение, как мы достигаем цели:

$config[ads_text6] not found

{title}


Здесь мы использовали инструмент подготовленных операторов, который библиотека PDO позволяет нам подключать к базе данных, и мы достигаем того, что введенное никогда не воспринимается в контексте, отличном от данных, мы также видим, что вместо Используя метод POST, мы использовали наш защищенный массив, это означает, что наши данные уже проверены, поэтому риск ниже.
На этом мы завершили этот урок, поскольку видим, что действия, которые мы можем предпринять, чтобы сделать наше приложение более безопасным, просты, не требуют усилий для человека, однако они помогают нам избежать наиболее распространенных атак и, возможно, более частых. Они даны. В PHP плохо воспринимают тех, кто говорит, что это небезопасный язык, но реальность такова, что небезопасность создается программистом, поскольку в языке есть только инструменты, которые мы можем использовать для улучшения и предотвращения атак на наши приложения с помощью данных, которые Введите пользователя.