$image_extension = strtolower(substr(strrchr($_FILES['image']['name'], '.'), 1));Но тут расширение файла берётся из $_FILES['image']['name'] - а его передаёт на сервер именно браузер пользователя. В этом и заключается у вас дыра, а что если расширение файла будет php или любое другое, обрабатываемое сервером как интерпретируемый скрипт.
$dsn = 'mysql:host=localhost;dbname=f5_shop;charset=utf8mb4';
header('Content-Type: text/html; charset=utf-8');