У меня есть приложение PHP.
Я разрешаю пользователям загружать файлы в мое веб-приложение.
Вопрос : Каков наилучший способ для меня дезинфицировать имена файлов загруженных документов $_FILES["filename"]["tmp_name"]
в PHP?
ОБНОВЛЕНИЕ :
Могу ли я взять MD5 загруженного имени файла и использовать его как новое назначенное имя файла? Если да, то как мне это сделать в PHP?
Чтобы избежать столкновения с именами файлов, просто проверьте, не существует ли заданное или сгенерированное имя файла:
do { // Generate filename, eg.: $filename = md5(uniqid()) . $fileExtension; } while (file_exists($filename));
Это дает вам 100% уверенность в том, что имя файла уникально. Использование md5 (или любого другого алгоритма хэширования) гарантирует, что имя файла будет безопасным и прост в обращении.
Готов поспорить, что вы также храните некоторую информацию о файле в базе данных. Если это правильно, вы можете использовать первичный ключ (ID) в качестве имени файла на своем сервере и сохранить исходное имя файла в базе данных. Это дает вам большую гибкость, поскольку вы можете манипулировать метаданными без переименования фактического файла.
Я просто запускаю простое регулярное выражение, которое заменяет любые не буквенно-цифровые символы символом подчеркивания (или просто удаляет этот символ в целом). Обязательно сохраните расширение.
Если вы хотите пойти немного дальше, вы можете использовать расширение magic mime, чтобы гарантировать, что файл является тем же самым форматом, о котором говорит расширение.
EDIT: Чтобы избежать конфликтов имен файлов в каталоге, вы можете добавить md5 пользователей IP + текущее время к имени файла.
Вместо того, чтобы дезинфицировать имена файлов, указанные пользователем, используйте любой другой уникальный идентификатор для этой фотографии и сохраните это имя файла. Я предпочитаю использовать идентификаторы пользователей, которые являются числовыми и всегда уникальными.
move_uploaded_file($_FILES["tmp_name"],"/home/yourname/".$user_id));
Затем вы можете получить изображение из любого места (например, S3 или даже собственного сервера), просто зная идентификатор пользователя. Вам даже не нужен атрибут в вашей базе данных для хранения URL-адресов изображений.
Ciao, эта функция также удаляет все точки, а затем я создаю чистую строку с расширением.
function sanitaze_upload_file($data) { $imgName = $data; $indexOFF = strrpos($imgName, '.'); $nameFile = substr($imgName, 0,$indexOFF); $extension = substr($imgName, $indexOFF); $clean = preg_replace("([^\w\s\d\-_~,;\[\]\(\)])", "", $nameFile); $NAMEFILE = str_replace(' ', '', $clean).$extension; return $NAMEFILE; }
Если вы не против потери фактических имен файлов, то, что я обычно делаю, это создать хэш имени файла и установить для него имя файла, если все, что вы разрабатываете, загружает множество загружаемых изображений, оно помогает избежать конфликтов, когда имена двух файлов называются и перезаписываются.
hash('md5', $_FILES["filename"]["tmp_name"]);