На днях я случайно беседовал с подругой, которая является техническим руководителем успешного стартапа, и пока мы смотрели финал Олимпийских игр по водному поло среди женщин, мы начали говорить о сбое PHP, который я обнаружил в дикой природе ?. Поскольку он был техническим руководителем, а я был средним разработчиком, я ожидал, что он уже справился с этой неудачей в своей повседневной работе, но... как бы удивительно это ни звучало, он этого не сделал.
«Провал», о котором я говорю, и вы, наверное, уже догадались, это не что иное, как свободное сравнение 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
Если вам интересно, как хакер мог подделать наши данные, у меня есть для вас два ответа:
Двигаемся дальше.
Здесь я демонстрирую проблему с 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.
Если вам нравится мой стиль письма и мой контент, не стесняйтесь нажать кнопку «Подписаться», и произойдут волшебные вещи! ??
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3