Привет всем, Я разрабатываю сайт для обмена фотографиями, используя CodeIgniter PHP framework. Идея состоит в том, что люди могли загружать свои фотографии, управлять ими (через какой-то файловый браузер, который позволяет им создавать вложенные папки, перетаскивать файлы и т. Д.) И редактировать их (некоторые основные вещи, такие как изменение размера, поворот и обрезка для начала, и позже, я добавлю некоторые дополнительные функции).Защита файлового менеджера PHP от его пользователей
Я уже реализовал стороннее решение для проверки подлинности для CI (Redux Authentication 2 Beta), и теперь я интегрирую файловый менеджер JS/PHP (AjaxExplorer), но проблема в том, что бэкэнд для управления файлами (перемещение, копирование , и т. д.) слишком много доверяет пользователю при вводе вызовов ajax. Например, он делает такие вещи, как это (упрощенные для ясности):
move_uploaded_file($_FILES['upload']['tmp_name'], $root.$username.$_POST['destination_dir']);
Как вы можете видеть, Есть очевидные проблемы безопасности, как он слепо принимает любой путь пользователь бросает в! Я уже вижу, что кто-то посылает что-то вроде «../AnotherUser/» в качестве значения $ _POST ['destination_dir'].
Мой вопрос: Каков наилучший способ «песочницы» пользователя, чтобы позволить ему управлять своими данными? Я просто проверяю + фильтровать входы, надеясь поймать каждую попытку вторжения? Существуют ли библиотеки/пакеты, предназначенные для решения этой конкретной проблемы?
Я думаю, что эта проблема должна быть каким-то образом решена в любом (достаточно зрелом) проекте, который дает своим пользователям возможность управлять своими файлами через веб-браузер, поэтому я ожидал найти некоторые четкие рекомендации по этому поводу (так как есть много о SQL Injection, XSS, CSRF и т. д.), но я думаю, что я не использую правильные ключевые слова.
Спасибо за ответ bobince! Это хорошее решение, но я обеспокоен переносимостью данных, так как простая резервная копия файлов подразумевает запуск некоторого сценария сначала для изменения схемы именования, и если моя база данных когда-либо будет скомпрометирована или повреждена, я проиграю структура древовидной структуры. – lima
Хорошее решение. @fandelost, затем убедитесь, что вы резервны как базы данных, так и файлы –
Прошу прощения за то, что ответили так долго. Я, наконец, подал в отставку «AjaxExplorer» и создал собственное решение для управления файлами, основанное на совете bobince, используя базу данных для хранения всего, что связано с файлами, но не трогало их после того, как они загружены за пределы корня веб-сайта. Я также ограничил поле «имя» для каждого из них ограниченным набором символов, и я не буду использовать вложенные папки, вместо этого я использую один уровень группировки (просто чтобы избежать ссылочного беспорядка). – lima