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

danneo

Честный
Регистрация
13 Ноя 2007
Сообщения
1.527
Реакции
121
Пользователь добавляет инфу, а к ней картинку. Картинка подгружается на ajax с уникальным названием. Когда загрузиться, в форме добавления сразу выводиться маленькая, а на ней кнопка для удаления. Если нажать на удаление, то она удаляется с сервера, тоже на ajax.
Вопрос относительно безопасности удаления картинки. Например, что мешает исправить html форму, указать нужную картинку и она будет удалена с сервера, хотя она была и не моя.
 
Пользователь добавляет инфу, а к ней картинку. Картинка подгружается на ajax с уникальным названием. Когда загрузиться, в форме добавления сразу выводиться маленькая, а на ней кнопка для удаления. Если нажать на удаление, то она удаляется с сервера, тоже на ajax.
Вопрос относительно безопасности удаления картинки. Например, что мешает исправить html форму, указать нужную картинку и она будет удалена с сервера, хотя она была и не моя.
ну так в базе есть пометка, кто автор заливки и соответственно запрет на удаление картинки, которая нет была залита автором.
+ есть ещё достаточное количество вариантов защит
 
ну так в базе есть пометка, кто автор заливки и соответственно запрет на удаление картинки, которая нет была залита автором.
+ есть ещё достаточное количество вариантов защит
Запись и картинку может добавить гость.
Т.е. нужно сделать запрос в БД по удаляемой картинке. Если выборка пришла, то проверять id юзера. Если это он, то удалять.
Правильно понял?
А какие еще есть варианты, без обращения к БД?
И еще такой вопрос... как можно передать id юзера (любые другие его данные) в файл-обработчик (delete.php), чтобы определить права? Если через ajax отдавать, то точно также можно и их подделать. Нужно как-то на уровне сервера отдавать...
 
А какие еще есть варианты, без обращения к БД?
И еще такой вопрос... как можно передать id юзера (любые другие его данные) в файл-обработчик (delete.php), чтобы определить права? Если через ajax отдавать, то точно также можно и их подделать. Нужно как-то на уровне сервера отдавать...

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

Ну и понятное дело, что после публикации или другого подходящего условия - переносим картинки из "temp_img" в место постоянного хранения - забирая у гостей возможность их удаления.
 
Последнее редактирование:
Путь к залитой картинке храни в сессии(данная технология позволит однозначно идентифицировать пользователя даже если он "гость")
все равно не понял...
допустим, я передал запрос на удаление и куки: название файла и PHPSESSID, php-файлу. Файл получил. Что он должен проверить? Как сохранить путь к картинке в сессии, ведь картинка отправляется через ajax?
 
Последнее редактирование:
все равно не понял...
допустим, я передал запрос на удаление и куки: название файла и PHPSESSID, php-файлу. Файл получил. Что он должен проверить? Как сохранить путь к картинке в сессии, ведь картинка отправляется через ajax?
зачем передавать путь на клиента и получать его назад, достаточно для начала сформировать уникальный и тяжело подбираемый идентификатор, и пользоваться этим идентификатором в сессии и так далее.
может стоит минимально пройтись по уже готовым решениям и подходам, чтоб не повторяться? задача же распостранённая, навскидку
Для просмотра ссылки Войди или Зарегистрируйся
Для просмотра ссылки Войди или Зарегистрируйся
Для просмотра ссылки Войди или Зарегистрируйся
 
зачем передавать путь на клиента и получать его назад, достаточно для начала сформировать уникальный и тяжело подбираемый идентификатор, и пользоваться этим идентификатором в сессии и так далее.
может стоит минимально пройтись по уже готовым решениям и подходам, чтоб не повторяться? задача же распостранённая, навскидку
Для просмотра ссылки Войди или Зарегистрируйся
Для просмотра ссылки Войди или Зарегистрируйся
Для просмотра ссылки Войди или Зарегистрируйся
мы вроде о разном... php-файл, который загружает, он и так имеет безопасность, в плане загрузки. Если я ему отдам файл, он его нормально обработает и загрузит/удалит.
Вопрос же стоит в том, как обезопасить при работе с ajax.
Для этого php файл должен определить, удаляемый файл принадлежит данному пользователю или нет. При загрузке же нужно определить, имеет ли пользователь права на загрузку или нет. А также ограничить по объему загружаемых файлов. Иначе можно напихать на сервак пару лишний гигов картинок по 500кб (ради прикола) :)
 
мы вроде о разном... php-файл, который загружает, он и так имеет безопасность, в плане загрузки. Если я ему отдам файл, он его нормально обработает и загрузит/удалит.
Вопрос же стоит в том, как обезопасить при работе с ajax.
Для этого php файл должен определить, удаляемый файл принадлежит данному пользователю или нет. При загрузке же нужно определить, имеет ли пользователь права на загрузку или нет. А также ограничить по объему загружаемых файлов. Иначе можно напихать на сервак пару лишний гигов картинок по 500кб (ради прикола) :)
ну запишите пользователю в куки определённый хеш (закодированный) и на сервере проверяйте он это или не он
 
пару вопросов в той же области... чтоб не создавать тему...
1 вопрос:
читал где-то, что все картинки сливать в один каталог не хорошо. Что когда их много будет, сервак будет тормозить. Что их лучше разбивать на каталоги, например, год/месяц/день, в зависимости сколько их планируется. А в БД скидывать полный путь картинки.
  • Насколько это правильно?
  • как лучше сохранять информацию о картинке в БД? Например, можно польный путь брать, но тогда нужно будет иногда его обрабатывать, чтобы получить название картинки без пути. А можно полный путь картинки сохранять в другое поле. Так будет два поля.. :)
Придется снова переделывать много кода :confused:
2 вопрос
Насколько безопасны данные в сессии? Например, нужно ли обрабатывать, когда беру из сессии название картинки? Не может ли там оказаться код какой-нибудь, типа SQL, PHP?
Подскажите, пожалуйста...
 
Данные в сессии "ниоткуда" не появляются. Они безопасны ровно настолько, насколько они проверяются при сохранении в сессию (откуда они попадают в сессию - зависит от логики работы приложения.. из базы, из 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'
 
Назад
Сверху