Всем доброго дня! Люди добрые, можете написать заданий для новичка. А я хочу попробовать их выполнить, а если что-то получится, я скину и меня закидают помидорами
попробуй написать безопасную загрузку изображений, с проверками и прочими. Процедурным кодом, функции и условия только.
@Fell-x27 сделал однажды подобное задание. Найди его. Заодно выполнишь тест на главный скилл программиста - умение находить ответ по минимальному набору вводных данных )
Я знаю где искать)) MouseZver скидывал 1 месяц назад ссылку на свое решение, просто я мучаю свою голову уже 6 часов Хочу сам додуматься, развиваю скилл мышления
А в чем проблема? Ну возьми и сделай сам. Сам спроектируй, сам напиши. Мы ведь об одном и том же говорим, верно?
Может себе бесплатного помощника взять в помощь, и научить чему то... ?) Хотя опять же в данном случае скилл думать не будет, просто будешь клепать код по входным данным.
Всем привет) Творение мое жестоко и беспощадно, но лучше все же чем ничего Код (Text): class UserFile { public $name; public $defaultDir; public $baseDir; public function GetFile () { move_uploaded_file($this->defaultDir,"$baseDir $this->name "); } } $type = ['image/jpeg', 'image/png']; if (in_array($_FILES['photo']['type'], $type)) { } else { $_FILES['photo']['error'] = "Невернй формат"; } if ($_FILES['photo']['size'] > 524288) { $_FILES['photo']['error'] = "Размер файла неболее 0.5 mb"; } $photo = new UserFile; $photo->name = $_FILES['photo']['name']; $photo->defaultDir = $_FILES['photo']['tmp_name']; $photo->baseDir = __DIR__; if (empty($_FILES['photo']['error']) && is_uploaded_file($_FILES['photo']['tmp_name'])) { $photo->GetFile(); }
@kentkent7, а этот класс нафига, если всё клиент делает? Ради одной функции в одну строчку длиной целый класс городить? Засунь уж тогда все проверки внутри класса. К примеру, чтоб я вызывал: PHP: $fileUpload = new FileUpload($_FILES["photo"], "/storage"); try { $uploadedPath = $fileUpload->doUpload(); } catch (FileUploadException $e) { die("Ошибка загрузки файла " . $e->getMessage()); } Слабо?
Это не безопасная загрузка файлов. Я думаю, что я тебе в твою загрузку файлов смогу залить shell.php и получу доступ к твоему сайту. На практике не юзал, но уверен, что это легко!
Я думаю реализация далеко не самая лучшая, но вот V 2.0 nub edition Код (Text): class UserFile { public $name; public $defaultDir; public $baseDir; public $type; protected $size = 524288; const TYPE = ['image/jpeg', 'image/png']; public function GetFile () { move_uploaded_file($this->defaultDir,"$baseDir $this->name "); } public function FileValidate ($sizeFile, $filesError) { if ($sizeFile > $this->size) { $filesError = "Недопустимый размер файла"; } if (!in_array($this->type, self::TYPE)) { $filesError = "Недопустимый тип файла"; } if (!is_uploaded_file($this->defaultDir)) { $filesError = "Ошибка загрузки"; } if (empty($filesError)) { $this->GetFile(); } else { return $filesError; } } } $image = new UserFile; $image->name = $_FILES['photo']['name']; $image->defaultDir = $_FILES['photo']['tmp_name']; $image->baseDir = __DIR__; $image->type = $_FILES['photo']['type']; $image->FileValidate($_FILES['photo']['size'], $_FILES['photo']['error']); --- Добавлено --- Какие есть замечания? Я тестил, через форму кроме картинок ничего не грузит, но я буду благодарен за любой совет --- Добавлено --- А так, ловлю помидоры и делаю пасту
Ты думаешь, что окромя как браузером, никак нельзя к тебе файл отправить? mime-тип надо ещё раз определить на сервере. Для картинок проще всего getimagesize дёрнуть на сервере, если не сработал - то плеваться. Ну опять клиентский код класса всё делает. Я же тебе показал, какой клиентский код должен быть. Вот попробуй сделать точно так же. Или ты про конструкторы не в курсах? Про исключения? Твоим классом пользоваться неудобно, а в мой предполагаемый - кинул элемент $_FILES и радуешься.
Его тоже обмануть можно без труда. shell.php можно из реальной картинки же сделать ) МОжно дернуть getimagesize и пересохранить картинку с вернувшимся расширением, вроде уже прилично закроем дыру для картинок А вот с другими файлами. придется повозиться )
Начну издалека. Вот смотрите, класс это набор функций (аналогия - конвейер по изготовлению автомобилей), экземпляр класса (объект) это уже изготовленный продукт, в данном случае автомашина. Да, все об этом в курсе. В классе прописаны разные методы (функции) которые делают всю работу. В случае конвейера это разные агрегаты на всем пути сборки/изготовления автомашины: какой-то агрегат приваривает что-то, какой-то прикручивает колеса и т.д. В некоторых ситуациях мы можем использовать эти функции в своих целях не создавая объекта (автомашину), т.е. взяли манипулятор какого-нибудь агрегата и сделали что-то с чем-то, нам незачем создавать новую машину, нам просто понадобилось использовать один из агрегатов этого автозавода. Это как раз отсылка сюда. Есть такой простой код: PHP: function doSomething(arg1, arg2) { $result = arg1+arg2; return $result; } Так вот вам нужно сделать из класса что-то наподобие этого. Т.е. класс будет принимать какие-то данные из вне и суметь делать с ним что-то. Это реализуется с помощью конструктора, что-то типа: PHP: class A { public arg1; public arg2; public function __constructor(arg1, arg2) { $this->arg1 = arg1; $this->arg2 = arg2; } // ну и далее делать что-нибудь со всем этим } В этом случае если вы попробуете просто создать экземпляр класса $a = new A(); , то интерпретатор заругается, типа "Ты вот создал во мне конструктор и сделал так что туда должны передаваться обязательные аргументы, ну и где они?". А когда вы сделаете вот так: $a = new A(arg1, arg2); то он удачно проглотит. В вашей ситуации вы должны работать с классом как с обработчиком, манипулятором и т.п. (вы туда что-нибудь закидываете и получаете какой-то результат), а не как с классом который создает объект и присваивает что-то свойствам этого объекта. Т.е. такая своеобразная вешалка для переменных и еще чего-нибудь. Надеюсь не перемудрил ЗЫ: Вот здесь можно посмотреть как человек создает класс и использует его, что называется на полную. И по назначению.
Для загрузки файлов можно создать вполне человеческий класс. в который закинул даже просто название поля и куда грузить - и он всё сделал. Зачем там недоклассы рисовать?
Я с конструктором вроде разобрался, ка Код (Text): class FileImg { public function __construct ($name, $loadDir){ $this->name = $name; $this->size = $name . ['size']; $this->type = $name . ['type']; $this->tmp = $name . ['tmp_name']; $this->error = $name . ['error']; $this->loadDir = $loadDir; } } Я конструктор вчера написал, сейчас изучаю безопасную загрузку и исключения. Я 2,5 месяца ток учу, многое не знаю, а знания не могу применить, вот так и живу
Для прокачивания скилла программирования — добро пожаловать на hackerrank и codewars. Для прокачивания навыков веб-разработки — имхо, лучше всего пройти пару-тройку соответствующих курсов или туториалы по современным фреймворкам, для получения общей картины и систематизированного получения актуальной информации. Опять же, никто сейчас руками обработку форм загрузки писать не будет (хотя как это делается, знать конечно нужно), а корочка в резюме не помешает. Хорошие туториалы есть здесь: https://knpuniversity.com/search?q=php https://knpuniversity.com/tracks/symfony На курсере (https://www.coursera.org) и Открытом образовании (https://openedu.ru/) есть курсы по веб-разработке, но не на PHP. На гикбрейнсе есть https://geekbrains.ru/professions/php_developer, может ещё что-то.