Я изучаю механизмы обхода загрузки файлов в PHP, которые включают в себя несколько методов, таких как обход расширений, типов mime и добавление магических байтов.
У меня есть простой скрипт (скопированный из
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
$target_dir = "uploads/";
$target_file = $target_dir . basename($_FILES["file"]["name"]);
$imageFileType = strtolower(pathinfo($target_file, PATHINFO_EXTENSION));
$check = getimagesize($_FILES["file"]["tmp_name"]);
$allowedTypes = ['jpg', 'jpeg', 'gif', 'png'];
print_r($imageFileType);
echo "Response: ". in_array($imageFileType, $allowedTypes);
if (in_array($imageFileType, $allowedTypes)) {
if (move_uploaded_file($_FILES["file"]["tmp_name"], $target_file)) {
echo "file = " . urlencode($target_file);
} else {
http_response_code(500);
echo "Sorry, there was an error uploading your file.";
}
} else {
http_response_code(400);
echo "File is not an image or not allowed.";
}
}
hello.php на hello.php.png, он загружается нормально.Но когда я пытаюсь получить доступ к файлу с помощью localhost/hello.php.png, он по-прежнему отображается как png, а не как PHP.
Чего здесь не хватает? Я вижу онлайн-руководства, в которых, если мы загрузим файл, изменив hello.php.png, он будет рассматриваться как PHP, поскольку магические байты — это PNG, но на самом деле файл — PHP. Я что-то пропустил?
Я хотел бы проголосовать за комментарий Альваро 10 раз, но мне разрешено сделать это только один раз. Этот код действительно мусор. Это не лучше, чем догадки новичков, соединяющие фрагменты кода, которые они на самом деле не понимают. ИИ как программист находится примерно на уровне человека, который программирует неделю.
Помните, что ChatGPT просто знает, как расположить слова в правильном порядке, чтобы они звучали связно и правдоподобно в предложении (или в компьютерной программе, которая также является своего рода языком). Его основной навык — приятно поговорить с вами. Вторичным навыком иногда является способность создавать значимый контент на основе того, что он почерпнул из других источников. Но, как говорится... мусор на входе, мусор на выходе... и зачастую не видит разницы. Оно не может заменить вашу способность писать код. Иногда это может ускорить процесс, если вы знаете, как проверить, что то, что он производит, имеет смысл.
P.S. Вы должны знать, что контент, созданный искусственным интеллектом , запрещен на Stackoverflow - именно из-за такого рода проблемы... люди получают то, что выглядит правдоподобным результатом, но на самом деле это по большей части чепуха, и тогда все пытаются тратить время. отбери его еще раз. Достойные сценарии загрузки и проверки файлов уже имеются в большом количестве в Интернете, не так уж и сложно повторно использовать правильный контент, написанный знающими людьми, а не то, что, в конце концов, является просто несколько сложным инструментом для догадок.
Взгляните, например, на Скрипт полной безопасной загрузки изображений. Написано реальными людьми, с реальными знаниями.






Чтобы hello.php.png выполнялся как PHP-скрипт, вам необходимо, чтобы ваш веб-сервер был настроен для этого. Один из возможных способов — использовать HTTP-сервер Apache и директиву AddHandler для идентификации скриптов:
AddHandler application/x-httpd-php .php
или:
AddType application/x-httpd-php php
Как предупреждает документация:
Аргумент расширения не чувствителен к регистру и может быть указан с точкой в начале или без нее. Имена файлов могут иметь несколько расширений, и аргумент расширения будет сравниваться с каждым из них.
По этой причине руководство PHP рекомендует другой механизм:
Скажите Apache, чтобы он анализировал определенные расширения как PHP. Например, давайте иметь Apache для анализа файлов .php как PHP. Вместо использования только Apache AddType, мы хотим избежать потенциально опасных загрузок и созданные файлы, такие как эксплойт.php.jpg, не выполняются как PHP. Используя этот пример, вы можете проанализировать любое расширение(я) как PHP, выполнив просто добавив их. Мы добавим .php для демонстрации.
<FilesMatch \.php$> SetHandler application/x-httpd-php </FilesMatch>
По сути, это конкретный эксплойт для конкретной уязвимой установки.
Кстати, этот код представляет собой компиляцию всего, что вы можете сделать неправильно в сценарии загрузки файла: выполнять избыточные проверки (запрос POST?) и опускать важные проверки (удалась ли загрузка?), использовать относительные пути, чтобы вы никогда не могли быть уверены в где файлы сохраняются, сохраняются необработанные загрузки в общедоступном месте, используется имя файла, предоставленное пользователем, выполняется более или менее достоверная проверка изображения, но никогда не используется результат, генерируется 500 Internal Server Error для ошибок пользователя... Почему люди так думают прославленный интеллектуальный текст умеет кодировать?