«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Безопасное кодирование PHP: не позволяйте коду потеряться

Безопасное кодирование PHP: не позволяйте коду потеряться

Опубликовано 20 августа 2024 г.
Просматривать:391

На днях я случайно беседовал с подругой, которая является техническим руководителем успешного стартапа, и пока мы смотрели финал Олимпийских игр по водному поло среди женщин, мы начали говорить о сбое PHP, который я обнаружил в дикой природе ?. Поскольку он был техническим руководителем, а я был средним разработчиком, я ожидал, что он уже справился с этой неудачей в своей повседневной работе, но... как бы удивительно это ни звучало, он этого не сделал.
«Провал», о котором я говорю, и вы, наверное, уже догадались, это не что иное, как свободное сравнение PHP. Честно говоря, я бы назвал это не столько провалом, сколько особенностью, но ее использование может быть настолько опасным, что в этом смысле это провал! Давайте займемся нашим ботаном!

PHP Secure Coding: Don

Оглавление

  • Свободное сравнение PHP
  • Уязвимые сценарии
    • Небезопасная система входа в систему
    • Небезопасная авторизация с изюминкой
  • Устранение ошибки свободного сравнения
  • Заключение
  • Проявите любовь @Sudorealm

Свободное сравнение PHP

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

if ('string' == true){
 echo 'Weedle I choose you';
}
else{
 echo 'Charizard I choose you';
}

Хотите верьте, хотите нет, но мы собираемся отправить в бой трехуровневого Видла, а наш Чаризард остается неиспользованным. ПОЧЕМУ? В приведенном выше примере PHP преобразует строку 'string' в true перед сравнением ее с true, что приводит к истинному сравнению ?. Такое поведение, хотя иногда и полезно, может быть опасным, если его не понимать и не контролировать должным образом.

Для получения дополнительной информации ознакомьтесь с этой таблицей свободных сравнений из документации PHP.

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

Уязвимые сценарии

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

Небезопасная система входа

Во фрагменте ниже вы видите очень простую логику системы входа в систему.

$username = $_POST['username'];
$password = $_POST['password'];

if ($username == 'admin' && $password == '12345') {
    // Grant access
}

Предположим, что хитрый хакер подделывает отправленные данные и делает их: $_POST['username'] = true и $_POST['password'] = true, что приведет к:

$username = $_POST['username'];
$password = $_POST['password'];

if (true == 'admin' && true == '12345') {
    // Grant access
}

# Now that hacker has been granted access to our App... Good for him, not for us

Если вам интересно, как хакер мог подделать наши данные, у меня есть для вас два ответа:

  1. Пользовательский запрос с помощью Curl.
  2. Берпсьют

Двигаемся дальше.

Небезопасная авторизация с изюминкой

Здесь я демонстрирую проблему с PHP, которая может вас шокировать.

$user_role = $_POST['user_role']; // Example: 'admin', 'editor', 'viewer'

// Authorization check using a switch statement
switch ($user_role) {
    case 'crazyDifficultAdminRoleNooneWouldEverGuess':
        // Admin privileges
        echo "Access granted: Super Admin level";
        break;

    case 'editor':
        // Editor privileges
        echo "Access granted: Editor level";
        break;

    case 'viewer':
        // Viewer privileges
        echo "Access granted: Viewer level";
        break;

    default:
        // No access
        echo "Access denied: Invalid role";
        break;
}

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

А что, если им вообще не придется гадать?☠️

Знаете ли вы, что в Switch Case используется свободное сравнение? Ха! возможно, вы сейчас будете в шоке!
Это означает, что если хакер добавит $_POST['user_role'] = true, то он получит доступ к нашему первому случаю в нашем операторе переключения независимо от значения. Разве это не боль внизу? Прочтите документацию.

Устранение ошибки свободного сравнения

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

Вот решение проблемы небезопасной авторизации с использованием выражения соответствия:

$user_role = $_POST['role'];

$response = match ($user_role) {
    'crazyDifficultAdminRoleNooneWouldEverGuess' => "Access granted: Super Admin level",
    'editor' => "Access granted: Editor level",
    'viewer' => "Access granted: Viewer level",
    default => "Access denied: Invalid role",
};

echo $response; # This outputs: 'Access denied: Invalid role' when role is set to true

Заключение

Знаете ли вы об опасностях небрежного сравнения и жонглирования типами в PHP? Если вы этого не сделали, то теперь вы это сделаете. Пусть эта простая статья послужит напоминанием о необходимости всегда читать документацию и иметь четкое представление обо всем, что вы используете при программировании. Любопытство является ключевым моментом, когда вы стремитесь стать лучшим в своем деле!

Придерживаясь строгой дисциплины === и высокой точности соответствия, вы можете держать свой PHP-код на коротком поводке, гарантируя, что он будет вести себя именно так, как вы ожидаете. Помните: немного строгости сейчас может избавить вас от головной боли позже. Пусть это будет игривым намеком на то, что независимо от того, на каком этапе вашего пути программирования вы находитесь, всегда есть что-то новое, чему можно научиться. Так что держите глаза открытыми, сохраняйте любопытство и не позволяйте этим случайным сравнениям ускользнуть в сеть! ?

Обо мне

Вы можете узнать больше обо мне в моем личном блоге на sudorealm.com.

Если вам нравится мой стиль письма и мой контент, не стесняйтесь нажать кнопку «Подписаться», и произойдут волшебные вещи! ??

Заявление о выпуске Эта статья воспроизведена по адресу: https://dev.to/athanstan/php-secure-coding-dont-let-the-code-get-loose-26ja?1 Если есть какие-либо нарушения, пожалуйста, свяжитесь с [email protected] удалить его
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3