Защита от удаления не своих файлов

Тема в разделе "Как сделать...", создана пользователем danneo, 1 янв 2014.

  1. danneo

    danneo Честный

    Регистр.:
    13 ноя 2007
    Сообщения:
    1.418
    Симпатии:
    109
    Пользователь добавляет инфу, а к ней картинку. Картинка подгружается на ajax с уникальным названием. Когда загрузиться, в форме добавления сразу выводиться маленькая, а на ней кнопка для удаления. Если нажать на удаление, то она удаляется с сервера, тоже на ajax.
    Вопрос относительно безопасности удаления картинки. Например, что мешает исправить html форму, указать нужную картинку и она будет удалена с сервера, хотя она была и не моя.
     
  2. Шумадан

    Шумадан Хабарра!!11

    Регистр.:
    6 фев 2008
    Сообщения:
    1.722
    Симпатии:
    2.097
    ну так в базе есть пометка, кто автор заливки и соответственно запрет на удаление картинки, которая нет была залита автором.
    + есть ещё достаточное количество вариантов защит
     
  3. danneo

    danneo Честный

    Регистр.:
    13 ноя 2007
    Сообщения:
    1.418
    Симпатии:
    109
    Запись и картинку может добавить гость.
    Т.е. нужно сделать запрос в БД по удаляемой картинке. Если выборка пришла, то проверять id юзера. Если это он, то удалять.
    Правильно понял?
    А какие еще есть варианты, без обращения к БД?
    И еще такой вопрос... как можно передать id юзера (любые другие его данные) в файл-обработчик (delete.php), чтобы определить права? Если через ajax отдавать, то точно также можно и их подделать. Нужно как-то на уровне сервера отдавать...
     
    Шумадан нравится это.
  4. latteo

    latteo Эффективное использование PHP, MySQL

    Moderator
    Регистр.:
    28 фев 2008
    Сообщения:
    1.401
    Симпатии:
    1.182
    Все заливаемые картинки помещай сначала в некую временную папку, например "temp_img".
    Путь к залитой картинке храни в сессии(данная технология позволит однозначно идентифицировать пользователя даже если он "гость")
    Перед удалением проверяй, что имя картинки в сессии совпадает с именем картинки, которую пользователь хочет удалить, так же жёстко ограничь возможность удаления только временной папкой.
    Периодически вычищай "temp_img", удаляя все файлы которые старше, скажем, суток - на случай если пользователь залил картинку, но дальше отвалился.

    Ну и понятное дело, что после публикации или другого подходящего условия - переносим картинки из "temp_img" в место постоянного хранения - забирая у гостей возможность их удаления.
     
    Последнее редактирование: 2 янв 2014
    Шумадан и danneo нравится это.
  5. danneo

    danneo Честный

    Регистр.:
    13 ноя 2007
    Сообщения:
    1.418
    Симпатии:
    109
    все равно не понял...
    допустим, я передал запрос на удаление и куки: название файла и PHPSESSID, php-файлу. Файл получил. Что он должен проверить? Как сохранить путь к картинке в сессии, ведь картинка отправляется через ajax?
     
    Последнее редактирование: 3 янв 2014
  6. Шумадан

    Шумадан Хабарра!!11

    Регистр.:
    6 фев 2008
    Сообщения:
    1.722
    Симпатии:
    2.097
    зачем передавать путь на клиента и получать его назад, достаточно для начала сформировать уникальный и тяжело подбираемый идентификатор, и пользоваться этим идентификатором в сессии и так далее.
    может стоит минимально пройтись по уже готовым решениям и подходам, чтоб не повторяться? задача же распостранённая, навскидку
    http://www.softtime.ru/forum/read.php?id_forum=2&id_theme=72650
    http://myrusakov.ru/php-loadserver-security.html
    http://www.cy-pr.com/forum/f58/t14794/
     
  7. danneo

    danneo Честный

    Регистр.:
    13 ноя 2007
    Сообщения:
    1.418
    Симпатии:
    109
    мы вроде о разном... php-файл, который загружает, он и так имеет безопасность, в плане загрузки. Если я ему отдам файл, он его нормально обработает и загрузит/удалит.
    Вопрос же стоит в том, как обезопасить при работе с ajax.
    Для этого php файл должен определить, удаляемый файл принадлежит данному пользователю или нет. При загрузке же нужно определить, имеет ли пользователь права на загрузку или нет. А также ограничить по объему загружаемых файлов. Иначе можно напихать на сервак пару лишний гигов картинок по 500кб (ради прикола) :)
     
  8. Шумадан

    Шумадан Хабарра!!11

    Регистр.:
    6 фев 2008
    Сообщения:
    1.722
    Симпатии:
    2.097
    ну запишите пользователю в куки определённый хеш (закодированный) и на сервере проверяйте он это или не он
     
  9. danneo

    danneo Честный

    Регистр.:
    13 ноя 2007
    Сообщения:
    1.418
    Симпатии:
    109
    пару вопросов в той же области... чтоб не создавать тему...
    1 вопрос:
    читал где-то, что все картинки сливать в один каталог не хорошо. Что когда их много будет, сервак будет тормозить. Что их лучше разбивать на каталоги, например, год/месяц/день, в зависимости сколько их планируется. А в БД скидывать полный путь картинки.
    • Насколько это правильно?
    • как лучше сохранять информацию о картинке в БД? Например, можно польный путь брать, но тогда нужно будет иногда его обрабатывать, чтобы получить название картинки без пути. А можно полный путь картинки сохранять в другое поле. Так будет два поля.. :)
    Придется снова переделывать много кода :confused:
    2 вопрос
    Насколько безопасны данные в сессии? Например, нужно ли обрабатывать, когда беру из сессии название картинки? Не может ли там оказаться код какой-нибудь, типа SQL, PHP?
    Подскажите, пожалуйста...
     
  10. esche

    esche

    Регистр.:
    9 авг 2009
    Сообщения:
    360
    Симпатии:
    243
    Данные в сессии "ниоткуда" не появляются. Они безопасны ровно настолько, насколько они проверяются при сохранении в сессию (откуда они попадают в сессию - зависит от логики работы приложения.. из базы, из GET/POST).

    Смотря как планируется её использовать в дальнейшем. В любом случае, из полного пути несложно получить абсолютный (зная путь к каталогу с картинками), basename и dirname. Если путь формируется по некоему алгоритму - возможно, и нет смысла его хранить...

    К примеру, ситуация, когда у товара (id-шник товара) несколько картинок. Название картинки соответствует её порядковому номеру (1.jpg, 2.jpg), а путь - соответствует ID товара (images/product/215/1.jpg) - инфу о файле в базе можно и не хранить..

    И да.. чтоб "много не переписывать" - имеет смысл правильно проектировать архитектуру приложения и избегать дублирования кода. (к примеру, помещать получение пути к картинке в метод класса Image.. и в остальных местах использовать уже его:
    Код:
    $image = Image::model()->findByPk(155);
    echo $image->getPath(); // возвращает что-то вроде '/images/product/255/1.jpg'
     
    danneo и Шумадан нравится это.