За последние 24 часа нас посетили 20187 программистов и 2036 роботов. Сейчас ищут 1537 программистов ...

Насколько безопасно такое сохранение файло

Тема в разделе "Обработка изображений средствами PHP", создана пользователем Алекс8, 30 май 2017.

  1. Алекс8

    Алекс8 Активный пользователь

    С нами с:
    18 май 2017
    Сообщения:
    1.730
    Симпатии:
    359
    В общем у клиента есть скрипт (не я делал), который определенным образом изменяет загружаемые изображение.
    В кратце работает так:
    1. Загружает через input file изображение, оно сохранятся где то на сервере.
    2. Потому JS библиотека это изображение берет с сервера.
    3. Как нужно изменяет.
    4. И теперь внимание.
    5. JS берет изображение вот так вот
    Код (Javascript):
    1. var canvasData = c.toDataURL();
    и отправляет POST запросом в такую функцию..

    PHP:
    1. if($_GET['action'] == "save") {
    2.     # echo "<pre>"; print_r($_GET); echo "</pre>";
    3.    $img = $_POST['imgData'];
    4.     $img = str_replace('data:image/png;base64,', '', $img);
    5.     $img = str_replace(' ', '+', $img);
    6.     $data = base64_decode($img);
    7.     $file_name = 'box1-'.rand(111,999).'-'.rand(111,999).'.png';
    8.     $file = PATH.'uploads/'.$file_name;
    9.     $_SESSION['box2'] = $file_name;
    10.     $success = file_put_contents($file, $data);
    11.     echo $_SESSION['box2'];
    12.    
    13.     exit;
    14. }
    не кажется ли уважаемому сообществу что тут дыра через которую можно загрузить кое чего лишнего?
     
  2. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.799
    Симпатии:
    1.331
    Адрес:
    Лень
    Терабайт данных
     
    Алекс8 нравится это.
  3. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Уважаемое сообщество намекает, что ограничения на размер и количество передаваемых извне файлов настраивается на любом уровне приложения на уровне конфигов. Хоть на Nginx, хоть на Apache, хоть в самом PHP. Хоть на каком любом другом веб-сервере, реверспрокси, балансировщике или что там может вообще использоваться в конкретно взятой системе.
     
    Алекс8 нравится это.
  4. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    загрузить можно что угодно, картинки не пережимаются
    про сессию вообще не понял к чему оно
     
    Алекс8 нравится это.
  5. Алекс8

    Алекс8 Активный пользователь

    С нами с:
    18 май 2017
    Сообщения:
    1.730
    Симпатии:
    359
    вот и у меня такое ощущение возникло)) надо переделывать)) вообще как то странно весь скрипт написан..
     
  6. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Алекс8 нравится это.
  7. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    А...речь шла именно о защите самой загрузки, ок.
     
  8. Zuldek

    Zuldek Старожил

    С нами с:
    13 май 2014
    Сообщения:
    2.381
    Симпатии:
    344
    Адрес:
    Лондон, Тисовая улица, дом 4, чулан под лестницей
    Очевидно есть некая логика через сессии следущая за загрузкой, либо так первично и для перформанса пишется связь форма-загрузки чтобы потом перенести в постоянное хранилище. Вариантов много, и да - реализация в топике это гуанокод;)
     
    #8 Zuldek, 31 май 2017
    Последнее редактирование: 31 май 2017
  9. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    рейс кондишн привет
    --- Добавлено ---
    в смысле? Я не понял.
     
  10. Zuldek

    Zuldek Старожил

    С нами с:
    13 май 2014
    Сообщения:
    2.381
    Симпатии:
    344
    Адрес:
    Лондон, Тисовая улица, дом 4, чулан под лестницей
    вполне вероятно что и не будет рейс кондишн тут. Не известно же до конца что под капотом и куда пишутся сессии.
     
  11. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    ну
    я чета не вижу способа избежать рейс кондишн при работе с глобальной штукой, существующей между запросами, при этом там явно где-то есть код, который зависит от этого значения.
    хз
     
  12. Maputo

    Maputo Активный пользователь

    С нами с:
    30 июл 2015
    Сообщения:
    1.136
    Симпатии:
    173
    Минимизировать и без того маловероятные баги с рейс кондишн можно поменяв местами 9-ю и 10-ю строчку.
    Проблемы безопасности такой загрузки зависят от значения константы PATH.
    Пугает ограниченность имен файлов. Лично я использую time() + rand() для этого.

    P.S.: Зачем нужна переменная $success?
     
    #12 Maputo, 3 июл 2017
    Последнее редактирование: 3 июл 2017
  13. Алекс8

    Алекс8 Активный пользователь

    С нами с:
    18 май 2017
    Сообщения:
    1.730
    Симпатии:
    359
    не знаю)) это был чужой код)) я все стер - и сделал заново))
    Вот что получилось http://3dcoverdesign.ru/
     
  14. Maputo

    Maputo Активный пользователь

    С нами с:
    30 июл 2015
    Сообщения:
    1.136
    Симпатии:
    173
    Обложка растягивается, а торец книги обрезается. Значит есть обработка картинок. Только надо еще поставить проверку типа файла. Загрузил EPS - сервер пытался его скушать. До сих пор грузится.
     
  15. Алекс8

    Алекс8 Активный пользователь

    С нами с:
    18 май 2017
    Сообщения:
    1.730
    Симпатии:
    359
    сервер кушает только готовые изображения.. обработка входящих изображений происходит на стороне клиента..
    так что если вертится и ничего не происходит)) где то косяк в JS)
     
  16. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    обычно рейс кондишн нельзя вылечить переставляя строки. :D
    и уж тем более в случае, если кому-то пришло в голову использовать сессию. Проблема с сессией в том, что юзер может сделать несколько запросов к этому скрипту, но в сессию попадёт только одно значение, и сложно сказать заранее, какое именно. Более того, при обращении к другому скрипту, где это значение из сессии как раз используется зачем-то, это значение уже может быть перезаписано (а может и не быть перезаписано), и даже не один раз.

    Короче это какое-то непредсказуемое болото.
     
  17. Maputo

    Maputo Активный пользователь

    С нами с:
    30 июл 2015
    Сообщения:
    1.136
    Симпатии:
    173
    Речь шла не о самом рейс кондишн, а о последствиях (багах)
    Перестановка строк гарантирует, что пользователь получит через сессию имя файла с непустым содержимым. Да, файл может быть и не тот, с учетом того, что и имена файлов у разных посетителей могут совпасть. Проблема не только в сессии.
     
  18. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    а, ну да, хорошо бы сначала проверить, записалось ли, а только потом в сессию заносить, это точно, ты прав.