Но тут расширение файла берётся из $_FILES['image']['name'] - а его передаёт на сервер именно браузер пользователя. В этом и заключается у вас дыра, а что если расширение файла будет php или любое другое, обрабатываемое сервером как интерпретируемый скрипт.
Так делать не надо, нужно завести список допустимых расширений и уже из этого списка выбирать наиболее подходящий вариант.
И в PHP где-то вначале перед выводом всего прочего: header('Content-Type: text/html; charset=utf-8');
Ну и на всякий пожарный убедиться, что PHP-скрипт сохранён в кодировке UTF-8 без BOM (если в файле не содержится русских символов - то это не принципиально и кодировка ANSI будет совпадать с UTF-8).
Тимофей, да, основан на небезопасных модулях, но если там эти модули используются только для сборки и в продакшен не попадают, то использовать их можно.
Евгений Иванов, при запросе - клиент отправляет завёрнутый, каждый узел последовательно разворачивает, при ответе - наоборот, каждый узел заворачивает, а клиент их все разворачивает в конце.
ZakkMalin, велосипед на восьмиугольных колёсах тоже будет неплохо ездить, но при этом он будет стучать этими самыми углами, да и вообще будет неэффективен по сравнению с круглыми колёсами)
Так делать не надо, нужно завести список допустимых расширений и уже из этого списка выбирать наиболее подходящий вариант.