Я не знаю, произойдет ли это, но я попробую.
В прошлый час я исследовал безопасность загрузки изображений. Я узнал, что есть много функций для тестирования загрузки.
В моем проекте мне нужно быть в безопасности с загруженными изображениями. Там также может быть очень большой объем, и для этого может потребоваться большая пропускная способность, поэтому покупка API не является вариантом.
Итак, я решил получить полный PHP script для БЕСПЛАТНОЙ безопасной загрузки изображений. Я также думаю, что это поможет многим людям, потому что невозможно найти действительно безопасный. Но я не эксперт по php, поэтому для меня очень важно добавить некоторые функции, поэтому я попрошу эту помощь сообщества создать один полноценный script ДЕЙСТВИТЕЛЬНО безопасного загрузки изображения.
Действительно отличные темы о том, что здесь (но они просто говорят, что нужно для трюка, но не как это сделать, и, как я уже сказал, я не мастер на PHP, поэтому я не могу сделайте это самостоятельно): Список проверки безопасности загрузки изображений PHP https://security.stackexchange.com/info/32852/risks-of-a-php-image-upload-form
В целом, они говорят, что это то, что необходимо для загрузки образа безопасности (я приведу цитату из приведенных выше страниц):
- Отключить запуск PHP внутри папки для загрузки с помощью .httaccess.
- Не разрешать загрузку, если имя файла содержит строку "php".
- Разрешить только расширения: jpg, jpeg, gif и png.
- Разрешить только тип файла изображения.
- Запретить изображение с двумя типами файлов.
- Измените имя изображения. Загрузите в подкаталог, а не в корневой каталог.
также:
- Повторно обработать изображение с помощью GD (или Imagick) и сохранить обработанное изображение. Все остальные просто забавны для хакеров "
- Как указано в rr, используйте move_uploaded_file() для любой загрузки"
- Кстати, вы хотите быть очень ограничительным в своей папке загрузки. Эти места являются одним из темных углов, где многие подвиги бывает. Это справедливо для любого типа загрузки и любого программирования
язык/сервер. Проверьте
https://www.owasp.org/index.php/Unrestricted_File_Upload- Уровень 1: проверьте расширение (файл расширения заканчивается)
- Уровень 2: проверьте тип MIME ($ file_info = getimagesize ($ _ FILES ['image_file']; $file_mime = $file_info ['mime'];)
- Уровень 3: прочитайте первые 100 байт и проверьте, есть ли у них какие-либо байты в следующем диапазоне: ASCII 0-8, 12-31 (десятичный).
- Уровень 4: проверьте магические числа в заголовке (первые 10-20 байт файла). Вы можете найти некоторые файлы заголовков байтов из здесь:
http://en.wikipedia.org/wiki/Magic_number_%28programming%29#Examples- Возможно, вы захотите запустить "is_uploaded_file" в $_FILES ['my_files'] ['tmp_name']. См
http://php.net/manual/en/function.is-uploaded-file.php
Вот большая его часть, но все же это не все. (Если вы знаете что-то еще, что может помочь сделать загрузку даже безопаснее, пожалуйста, поделитесь ею.)
ЭТО, ЧТО МЫ СЕЙЧАС
-
Основной PHP:
function uploadFile ($file_field = null, $check_image = false, $random_name = false) { //Config Section //Set file upload path $path = 'uploads/'; //with trailing slash //Set max file size in bytes $max_size = 1000000; //Set default file extension whitelist $whitelist_ext = array('jpeg','jpg','png','gif'); //Set default file type whitelist $whitelist_type = array('image/jpeg', 'image/jpg', 'image/png','image/gif'); //The Validation // Create an array to hold any output $out = array('error'=>null); if (!$file_field) { $out['error'][] = "Please specify a valid form field name"; } if (!$path) { $out['error'][] = "Please specify a valid upload path"; } if (count($out['error'])>0) { return $out; } //Make sure that there is a file if((!empty($_FILES[$file_field])) && ($_FILES[$file_field]['error'] == 0)) { // Get filename $file_info = pathinfo($_FILES[$file_field]['name']); $name = $file_info['filename']; $ext = $file_info['extension']; //Check file has the right extension if (!in_array($ext, $whitelist_ext)) { $out['error'][] = "Invalid file Extension"; } //Check that the file is of the right type if (!in_array($_FILES[$file_field]["type"], $whitelist_type)) { $out['error'][] = "Invalid file Type"; } //Check that the file is not too big if ($_FILES[$file_field]["size"] > $max_size) { $out['error'][] = "File is too big"; } //If $check image is set as true if ($check_image) { if (!getimagesize($_FILES[$file_field]['tmp_name'])) { $out['error'][] = "Uploaded file is not a valid image"; } } //Create full filename including path if ($random_name) { // Generate random filename $tmp = str_replace(array('.',' '), array('',''), microtime()); if (!$tmp || $tmp == '') { $out['error'][] = "File must have a name"; } $newname = $tmp.'.'.$ext; } else { $newname = $name.'.'.$ext; } //Check if file already exists on server if (file_exists($path.$newname)) { $out['error'][] = "A file with this name already exists"; } if (count($out['error'])>0) { //The file has not correctly validated return $out; } if (move_uploaded_file($_FILES[$file_field]['tmp_name'], $path.$newname)) { //Success $out['filepath'] = $path; $out['filename'] = $newname; return $out; } else { $out['error'][] = "Server Error!"; } } else { $out['error'][] = "No file uploaded"; return $out; } } if (isset($_POST['submit'])) { $file = uploadFile('file', true, true); if (is_array($file['error'])) { $message = ''; foreach ($file['error'] as $msg) { $message .= '<p>'.$msg.'</p>'; } } else { $message = "File uploaded successfully".$newname; } echo $message; }
-
И форма:
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post" enctype="multipart/form-data" name="form1" id="form1"> <input name="file" type="file" id="imagee" /> <input name="submit" type="submit" value="Upload" /> </form>
Итак, я прошу помочь, разместив фрагменты кода, которые помогут мне (и всем остальным) сделать эту загрузку изображений script, чтобы сделать ее более безопасной. Или путем совместного использования/создания полного script со всеми добавленными фрагментами.