Php 为什么laravel在创建或上载文件或文件夹后需要chmod()文件或文件夹?

Php 为什么laravel在创建或上载文件或文件夹后需要chmod()文件或文件夹?,php,laravel,chmod,Php,Laravel,Chmod,最近,我使用Apache、PHP-FPM和MariaDB部署了一个web服务器配置。它一直运行顺利,直到我的同事在上面部署了具有图像上传功能的laravel 4应用程序 问题是我禁用了PHP的chmod()函数和system()etc函数,而上传图像的脚本使用chmod()和umask()(我的同事说这是默认行为) 我知道有一个关于chmod的危险的争论,PHP告诉我们它是无害的,这告诉我们服务器永远不应该是777 我不明白的是,当PHP进程即使没有chmod(),也能正确读取上传的文件时,为什

最近,我使用Apache、PHP-FPM和MariaDB部署了一个web服务器配置。它一直运行顺利,直到我的同事在上面部署了具有图像上传功能的laravel 4应用程序

问题是我禁用了PHP的
chmod()
函数和
system()
etc函数,而上传图像的脚本使用
chmod()
umask()
(我的同事说这是默认行为)

我知道有一个关于
chmod
的危险的争论,PHP告诉我们它是无害的,这告诉我们服务器永远不应该是777

我不明白的是,当PHP进程即使没有
chmod()
,也能正确读取上传的文件时,为什么还需要
chmod()
?它甚至可以在不使用
chmod()
的情况下创建文件夹和删除文件夹,因为这些文件和文件夹是在PHP进程的正确权限下创建的

tl;dr
这就引出了我的问题,laravel 4中的文件上传是否需要
chmod()
才能正常工作?为什么

编辑
对于那些想了解代码的人(此代码位于
vendor/symfony/http foundation/symfony/Component/HttpFoundation/File/UploadedFile.php
):


我不能为拉雷维尔的推理辩护。它看起来确实是内置在他们的功能中的,但是快速搜索一下就会在下面找到评论


评论建议使用move_uploaded_file移动上传的文件后,权限设置为0600。如果web服务器和PHP进程在同一个所需的用户下运行,这将是很好的,但如果它依赖于组或web服务器在一般用户(如
apache
nobody
)下运行,则情况就不一样了。因此,我的假设是,Laravel这样做是为了与后一种系统兼容,因为0600意味着用户可以使用rw,并且无法访问该组或其他系统。

我无法解释Laravel背后的理由。它看起来确实是内置在他们的功能中的,但是快速搜索一下就会在下面找到评论


评论建议使用move_uploaded_file移动上传的文件后,权限设置为0600。如果web服务器和PHP进程在同一个所需的用户下运行,这将是很好的,但如果它依赖于组或web服务器在一般用户(如
apache
nobody
)下运行,则情况就不一样了。因此,我的假设是,Laravel这样做是为了与后一种系统兼容,因为0600表示用户为rw,无法访问该组或其他组。

能否显示一些代码,以便我们知道您在Laravel中具体谈论的功能。@Devon是的,如果您阅读链接到的帖子,我将立即进行编辑,编辑澄清了chmod本身并不危险,除非他们还能够通过
system()
exec()
@Devon执行上传的脚本。我想知道的不是它是否安全,我只是想知道为什么要付出额外的努力?你需要特别向Laravel开发人员询问这些信息,但我补充了我的假设。我想大多数人都会同意chmod是无害的。如果您担心流氓脚本更改文件的权限,那么最好换一种方式。如果要禁用chmod,请扩展该类并重写该函数。能否显示一些代码,以便我们知道您具体谈论的是Laravel中的哪个函数。@Devon是的,如果您阅读链接到的帖子,我将立即进行编辑,编辑澄清了chmod本身并不危险,除非他们还能够通过
system()
exec()
@Devon执行上传的脚本。我想知道的不是它是否安全,我只是想知道为什么要付出额外的努力?你需要特别向Laravel开发人员询问这些信息,但我补充了我的假设。我想大多数人都会同意chmod是无害的。如果您担心流氓脚本更改文件的权限,那么最好换一种方式。如果您想禁用chmod,请扩展这个类并重写这个函数。嗯,这确实很奇怪,因为文档中没有提到它,但用户报告了它,可能是一个bug。我会继续玩它,然后决定怎么做,非常感谢。嗯,这确实很奇怪,因为文档中没有提到它,但用户报告了它,可能是一个bug。我会继续玩,然后决定怎么做,非常感谢。
$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());