Symfony创建新的文件夹权限

时间:2016-02-15 14:12:45

标签: php apache symfony capistrano capifony

我使用Capifony部署了一个项目,并在创建文件夹时出错。以下代码位于服务中。也可能在控制器内,无所谓。

$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是在Web服务器上进行部署的用户。 Web服务器的用户是默认用户www-data,但如果我将www-data设置为Web目录的所有者,则不会出现问题吗?这意味着每个人都可以修改网络中的所有内容。

我还尝试在web/uploads文件夹中创建一个文件夹,但也失败了。

如何在不损害安全性的情况下www-data在无法访问的文件夹中创建文件夹?我是否需要将其中一个用户添加到新组或其他内容?我是否需要修改部署文件?我需要使用www-data作为部署用户吗?解决这个问题的方法是什么?

这也是我的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将这些权限授予这些文件夹,那可以吗?

1 个答案:

答案 0 :(得分: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);
    
  4. 解释它的作用"自动":

    set :permission_method, :acl
    

    使用setfacl设置权限。它不会改变目录的所有权 权限在部署时应用,并且仅影响已存在的目录。

    关于可写公共目录的安全问题:

    用户上传的文件永远不值得信任。将文件上载到公共目录可以解决许多可能的漏洞,必须非常小心。如果是上传的头像,可以通过使用GD或imagick处理图像来解决,然后再将其写入公共目录。