为什么 laravel 在创建或上传文件或文件夹后需要 chmod()?
why laravel needs to chmod() a file or folder after being created or uploaded?
最近,我使用 Apache、PHP-FPM 和 MariaDB 部署了一个 Web 服务器配置。 运行 很顺利,直到我的同事在上面部署了 laravel 4 具有图片上传功能的应用程序。
问题是我禁用了 PHP 的 chmod()
功能以及 system()
等功能,而上传图片的脚本使用 chmod()
和 umask()
(我的同事说这是默认行为)。
我知道有一个关于 chmod
和 PHP 的危险的争论,就像 this site that tells it is harmless, and this post 告诉服务器永远不应该是 777
我不明白的是,为什么 chmod()
进程即使没有 chmod()
也可以正确读取上传的文件?它甚至可以在没有 chmod()
的情况下创建文件夹和删除文件夹,因为这些文件和文件夹是在 PHP 进程的正确权限下创建的。
tl;dr
所以我的问题是,laravel 4 中的文件上传是否需要 chmod()
才能正常运行?为什么?
编辑
对于那些想知道代码的人(此代码在 vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/File/UploadedFile.php
中找到):
$target = $this->getTargetFile($directory, $name);
if (!@move_uploaded_file($this->getPathname(), $target)) {
$error = error_get_last();
throw new FileException(sprintf('Could not move file "%s" to "%s" (%S)', $this->getPathname(), $target, strip_tags($error['message'])));
}
@chmod($target, 0666 & ~umask());
我不能代表 Laravel 背后的推理。看起来它确实内置于他们的功能中,但对此进行快速搜索会在 http://php.net/manual/en/function.move-uploaded-file.php.
下显示评论
评论说用move_uploaded_file移动上传的文件后,权限设置为0600。如果web服务器和PHP进程在运行下就好了相同的所需用户,但如果它依赖于像 apache
或 nobody
这样的通用用户下的组或网络服务器 运行,则不是。所以我的假设是 Laravel 这样做是为了与后一个系统兼容,因为 0600 意味着用户可以读取并且无法访问组或其他人。
最近,我使用 Apache、PHP-FPM 和 MariaDB 部署了一个 Web 服务器配置。 运行 很顺利,直到我的同事在上面部署了 laravel 4 具有图片上传功能的应用程序。
问题是我禁用了 PHP 的 chmod()
功能以及 system()
等功能,而上传图片的脚本使用 chmod()
和 umask()
(我的同事说这是默认行为)。
我知道有一个关于 chmod
和 PHP 的危险的争论,就像 this site that tells it is harmless, and this post 告诉服务器永远不应该是 777
我不明白的是,为什么 chmod()
进程即使没有 chmod()
也可以正确读取上传的文件?它甚至可以在没有 chmod()
的情况下创建文件夹和删除文件夹,因为这些文件和文件夹是在 PHP 进程的正确权限下创建的。
tl;dr
所以我的问题是,laravel 4 中的文件上传是否需要 chmod()
才能正常运行?为什么?
编辑
对于那些想知道代码的人(此代码在 vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/File/UploadedFile.php
中找到):
$target = $this->getTargetFile($directory, $name);
if (!@move_uploaded_file($this->getPathname(), $target)) {
$error = error_get_last();
throw new FileException(sprintf('Could not move file "%s" to "%s" (%S)', $this->getPathname(), $target, strip_tags($error['message'])));
}
@chmod($target, 0666 & ~umask());
我不能代表 Laravel 背后的推理。看起来它确实内置于他们的功能中,但对此进行快速搜索会在 http://php.net/manual/en/function.move-uploaded-file.php.
下显示评论评论说用move_uploaded_file移动上传的文件后,权限设置为0600。如果web服务器和PHP进程在运行下就好了相同的所需用户,但如果它依赖于像 apache
或 nobody
这样的通用用户下的组或网络服务器 运行,则不是。所以我的假设是 Laravel 这样做是为了与后一个系统兼容,因为 0600 意味着用户可以读取并且无法访问组或其他人。