Я реализую скрипт для проверки изображения для загрузки с помощью php. На самом деле, скрипт php хорошо работает с файлами изображений gif, png и jpg, но когда у меня есть одно условие:
- Я взял изображение
theFileName.bmp
и переименовал его расширение в theFileName.jpg
.
- Затем я выбираю переименованный файл для загрузки.
Я переименовал имя файла изображения вручную на своем компьютере, а затем выбрал файл для загрузки.
Процесс загрузки занимает около 2 или 3 секунд, после чего ничего не появляется (даже ошибка), отображается только сообщение по умолчанию из браузера:
Соединение с localhost было прервано.
Как я могу запретить пользователю выбирать файл изображения (и любой другой файл в этом отношении), который не является действительным действительным изображением?
Решения здесь
Наконец, мне удалось придумать свои собственные решения. Это немного долго, но по крайней мере это может сделать работу! Надеюсь, это кому-нибудь поможет.
- Помогает предотвратить загрузку пользователем ненужного mime-типа
- Запретить пользователю использовать текстовый файл и переименовать его расширение и т. Д.
- Запретить пользователю использование текстового файла и изменение его типа mime
- Предотвратить из файла непрочитанное
- Запретить из файла содержит ошибку
- Запретить загрузку не http
- Запретить из изображения размер файла ширина: 0, высота: 0
Есть еще много вещей, которые нужно проверить и проверить, чтобы убедиться, что это безопасно с помощью этих средств.
# CHECK & TRY READ IMAGE FILE
function is_readable_image( $theTmpFileloc ){
try {
if ( !getimagesize( $theTmpFileloc ) ){
# THE IMAGE IS UNREADABLE
return false;
}
# THE IMAGE IS READABLE
return true;
}catch( Exception $e ){
# THE IMAGE IS OTHER FILE
return false;
}
}
# READ AND RETURN AN ARRAY OF IMAGE SIZES
function get_image_size( $theTmpFileloc ){
$imageSizes = array();
$tmpResults = getimagesize( $theTmpFileloc );
$imageSizes['width'] = $tmpResults[0];
$imageSizes['height'] = $tmpResults[1];
# IF EITHER WIDTH OR HEIGHT = 0, RETURN FALSE
if ( $tmpResults[0] == 0 || $tmpResults[1] == 0 ) {
return false;
}
return $imageSizes;
}
# READ AND RETURN AN IMAGE ACTUAL MIMETYPE
function get_image_mime( $theTmpFileloc ){
$imageMime = '';
$tmpResults = getimagesize( $theTmpFileloc );
$imageMime = $tmpResults['mime'];
return $imageMime;
}
# START OF PHP TO VALIDATE IMAGE FILE
if ( isset($_FILES['postImage']) && !empty($_FILES['postImage']['name']) ) {
$tmpFileLoc = $_FILES['postImage']['tmp_name'];
$array_file_type = array('image/gif', 'image/png', 'image/x-png', 'image/jpeg', 'image/pjpeg');
if ( $_FILES['postImage']['error'] == 1 ) {
# THE IMAGE FILE CONTAINS ERROR
$resMessage['Error'] = true;
}elseif ( !is_uploaded_file( $tmpFileLoc ) ) {
# PREVENT FROM UPLOADING FROM EXTERNAL SOURCE NOT HTTP
$resMessage['Error'] = true;
}elseif ( !is_readable_image( $tmpFileLoc ) ) {
# PREVENT FROM IMAGE IS INVALID OR OTHER MIMETYPE
$resMessage['Error'] = true;
}elseif ( !get_image_size( $tmpFileLoc ) ) {
# PREVENT FROM IMAGE SIZE 0, 0 OR INVALID ACTUAL MIMETYPE
$resMessage['Error'] = true;
}elseif ( !in_array( get_image_mime( $tmpFileLoc ), $array_file_type) ) {
# LEVEL 2 OF CHECKING AN IMAGE MIMETYPE
$resMessage['Error'] = true;
}else {
# other checks with file extension, max_size,
# dir is_writable and so on then move to move_uploaded_file
}
}