2016-02-15 6 views
1

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

$dir = $kernelDir . '/../web/newfolder/';// kerneldir is %kernel.root_dir% 
$fs=new Filesystem(); 
$fs->mkdir($dir); 

Это попытается создать новую папку внутри сети, но не удастся.

Проблема заключается в том, что разрешения для веб-папки:

drwxrwxr-x 11 deploy deploy 4096 Feb 15 14:52 web 

deploy является пользователь, который сделал развертывание на веб-сервере. Пользователь веб-сервера по умолчанию один www-data, но разве нет проблем, если я устанавливаю www-данные как владельца веб-каталога? Это означает, что каждый может изменить все в Интернете.

Я также попытался создать папку в папке web/uploads, и это тоже не сработает.

Как я могу создать www-data папку в папке, к которой у нее нет доступа, без ущерба для безопасности? Нужно ли добавлять одного из пользователей в новую группу или что-то еще? Мне нужно изменить мой файл развертывания? Нужно ли мне вместо этого использовать www-данные в качестве пользователя развертывания? Каков способ решения этой проблемы?

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

set :application, "test" 
set :domain,  "domain" 

set :deploy_to, "/var/www/html/" 
set :app_path, "app" 

set :repository, "file:///var/www/testproj" 
set :scm,   :git 
set :branch, "master" 

set :ssh_options, { 
    forward_agent: true, 
    paranoid: true, 
    keys: "~/.ssh/id_rsa" 
} 

set :deploy_via, :rsync_with_remote_cache 
default_run_options[:pty] = true 

set :user, "deploy"  
set :model_manager, "doctrine" 


role :web,  domain       # Your HTTP server, Apache/etc 
role :app,  domain, :primary => true  # This may be the same as your `Web` server 

set :keep_releases, 3 

set :use_sudo, false 


set :clear_controllers, false 
set :shared_files,  ["app/config/parameters.yml"] 
set :shared_children,  [app_path + "/logs", web_path + "/uploads", "vendor"] 



set :writable_dirs,  ["app/cache", "app/logs"] 
set :webserver_user, "www-data" 
set :permission_method, :acl 
set :use_set_permissions, true 

# Be more verbose by uncommenting the following line 
logger.level = Logger::MAX_LEVEL 

set :assets_install,    true 
set :dump_assetic_assets,  true 
set :use_composer,    true 
set :composer_options, "--dev --verbose --prefer-dist --optimize-autoloader --no-progress" 

Я думал что-то вроде:

set :shared_children,  [app_path + "/logs", web_path + "/uploads", "vendor",web_path + "/newfolder"] 


set :writable_dirs,  ["app/cache", "app/logs", web_path + "/newfolder", web_path + "/medics"] 

И это приведет к

drwxrwxrwx+ 4 deploy deploy 4096 Feb 15 15:36 cache 

lrwxrwxrwx 1 deploy deploy  36 Feb 15 15:35 logs -> /var/www/html/testproj/shared/app/logs 

lrwxrwxrwx 1 deploy deploy  38 Feb 15 15:35 newfolder-> /var/www/html/testproj/shared/web/newfolder 

lrwxrwxrwx 1 deploy deploy  39 Feb 15 15:35 uploads -> /var/www/html/testproj/shared/web/uploads 

Это нормально, если Capifony предоставляет эти разрешения этим папкам?

+0

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

+0

Ну, вот чего я пытаюсь избежать. Вопрос в том, как? –

+0

'$ dir = $ kernelDir. '/ Any_other_dir_outside_web/NewFolder /' '. Создайте выделенный каталог для ваших вещей и примените тот же метод, что и для кеш-каталога: http://symfony.com/doc/current/book/installation.html#checking-symfony-application-configuration-and-setup –

ответ

0
  1. Создайте каталог, в соответствии с которым вы создадите рабочие среды каталогов, например. app/mydirs, и добавьте его в историю vcs.

  2. Добавить каталог в конфигурации развертывания:

    set :shared_children,  [app_path + "/logs", web_path + "/uploads", "vendor", app_path + "/mydirs"] 
    set :writable_dirs,  ["app/cache", "app/logs", "app/mydirs"] 
    
  3. Измените код, чтобы использовать этот каталог:

    $dir = $kernelDir . '/mydirs/newfolder/';// kerneldir is %kernel.root_dir% 
    $fs=new Filesystem(); 
    $fs->mkdir($dir); 
    

Объяснение, что он делает "автоматически":

set :permission_method, :acl 

Использует setfacl для установки разрешений. Он не изменяет права собственности на каталоги.
Разрешения применяются во время развертывания и влияют только на уже существующие каталоги.

Вопросы безопасности о перезаписываемых публичных каталогах:

Файлы, загруженные пользователями никогда не следует доверять. Загрузка файлов в общедоступный каталог позволяет разблокировать многие возможные уязвимости, и их необходимо выполнять с большой осторожностью.В случае загрузки аватаров его можно решить, обработав изображения с помощью GD или imagick, прежде чем записывать их в общий каталог.

+0

Я использую SonataMediaBundle, который использует GD. Однако имеет смысл иметь доступ к ресурсу, а не обслуживать его через контроллер. Это просто быстрее. Я делал то же, что и вы, но в общей папке. Думал, что есть, может быть, еще один способ. –