本质上我发现你可以通过“open_basedir”阻止一个存在安全漏洞的站点修改/读取另一个站点。
但是当我使用 wordpress 上传媒体文件时出现错误
[error] 3048#0: *42070 FastCGI sent in stderr: "PHP Warning: file_exists(): open_basedir restriction in effect. File(/tmp/php51UUIj) is not within the allowed path(s): (/var/www/wordpress-site) in /var/www/wordpress-site/wp-includes/functions.php on line 2505
PHP Warning: file_exists(): open_basedir restriction in effect. File(/tmp//TheFile.tmp) is not within the allowed path(s): (/var/www/wordpress-site) in /var/www/wordpress-site/wp-includes/functions.php on line 2340
PHP Warning: touch(): open_basedir restriction in effect. File(/tmp/TheFile.tmp) is not within the allowed path(s): (/var/www/wordpress-site) in /var/www/wordpress-site/wp-admin/includes/file.php on line 177" while reading response header from upstream, client: 69.196.169.22, server: wordpress-site.com, request: "POST /wp-admin/async-upload.php HTTP/1.1", upstream: "fastcgi://unix:/var/run/php-fastcgi/php-fcgi.socket:", host: "wordpress-site.com", referrer: "http://wordpress-site.com/wp-admin/media-upload.php?post_id=245&"
从 nginx 中删除此行可以解决问题
fastcgi_param PHP_VALUE open_basedir=$document_root;
但是,这是因为 open_basedir 被禁用,现在一个站点中的漏洞可以访问另一个站点中的数据。是否有可能使用 open_basedir 并允许 wordpress 将 /tmp/somefile 移动到其自己的站点目录中?
答案1
这很直接,但解释得很好:open_basedir 就像尿裤子来保暖一样。
是的,它可以防止 file_get_contents 等函数访问所需目录之外的任何内容。但是我可以使用 exec("cat /etc/passwd", $res); 或执行类似操作的其他一些函数。
但是,要回答你的问题,在 PHP 中执行此操作的方法是添加允许的文件夹,并用冒号分隔。例如
"/var/www/horses.com:/tmp:/uploads"
答案2
在文档根目录 /var/www/wordpress-site 中为 wordpress 提供一个临时目录并让其使用该目录。
不要将 /tmp/ 添加到允许的目录列表中 - 那样不安全。