Показать сообщение отдельно
  #63 (permalink)  
Старый 17.02.2018, 23:47
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Том 63

Бастион

Сервер обязан проверять данные соответствию ожидаемых. Вы не разобрались с кодом, который я писал, а вам еще и советуют разное, и вы путаясь делаете то, что не следует.

Вы получаете ссылки на сетевые файлы, но не видно чтобы вы учитывали возможные случайные ошибки пользователя, и самые частые, это лишние пробелы по краям. Либо вы проверяя каждое значение формы в цикле (во время фильтрации), удаляете их, любо удалите их сразу у всех значений массива, если над данными производятся групповые операции:

if($_POST) {
    array_walk_recursive($_POST, function(&$v) {
        $v = trim(stripslashes($v));
    });
}


В вашем коде вы допускаете опасные ошибки. Не проверив наличие файла по сетевому пути (проверять его наличие загрузкой по факту, это расточительно), используя имя файла источника, опять таки не проверив что это за файл, загружаете его в каталог:

$file_name = basename('https://www.google.ru/images/srpr/logo11w.png');
file_put_contents('my_folder'.$file_name, file_get_contents($file));

Это предпосылка к тому, что на ваш сервер через эту дыру зальют исполняемый файл. Если каталог не защищен от запуска в нем исполняемых файлов, то его сразу же и запустят, и ...

Если, допустим, будут разрешены переходы при получении сетевых файлов, то придется анализировать заголовок Location, а к примеру я его могу и как location написать. В общем ранее написанный код лучше немного дополнить

//с учетом, что возможные крайние пробелы удалены в данных
if($url = //массив ссылок на сетевые файлы не пуст, empty тут как козе баян
    array_diff( //удалить из массива
        filter_var_array( //проверить массив данных
            $_POST['file'], 
            FILTER_VALIDATE_URL //фильтом проверки URL
        ), 
        [false]) //элементы не прошедшие фильтрацию
    ) {
    
    foreach($url as $a) {  
        $hdr = array_change_key_case(get_headers($a, 1)); //запросить информацию о файле, вернув заголовки как ключи в нижнем регистре 
        if(strpos($hdr[0], '200')) { //файл существует
            if(in_array($hdr['content-type'], $mime) && $hdr['content-length'] <= $size) $upl[] = $a; //если разрешенный тип и размер, добавить в загрузку  
        }
    }
     
    foreach($upl as $url) { //есть сетевые файлы для загрузки 
        if($f = @file_get_contents($url)) { //считываем файл
            //никаких сохранений в каталог
            //если использовать getimagesize для проверки разрешения, то только во временный файл
            //но можно получить ширину/высоту и без этого, просто распаковав эти данные из заголовка файла  
            //если тип, объем памяти Ок, отдаем на обработку
            if(processingIMG($f)) echo 'Error';   
        }
    }
}

function processingIMG($f, $name) {
    $end = 0;
    //то что предыдущие проверки типа возвращают ОК, еще не значит, что файл есть графика
    //здесь открывается GD ресурс из строки
    //если файл не графика, значит ресурс не будет создан  
    if(!$im = @imagecreatefromstring($f)) {
        $end = 1; //файл не является изображением
        goto out;
    }
    //далее операции над файлом
    //сохранение, под сгенерированным именем, по указанному пути, с одним типом, чай не галерея искусств
    //с определенным установками качеством через константу QUALITY
    imagejpeg($im, $name, QUALITY);
    out:
    @imagedestroy($im);
    return $end;
}

Последний раз редактировалось laimas, 18.02.2018 в 19:14.
Ответить с цитированием