0

我正在 Linux Web 服务器上开发 PHP Web 应用程序,以获取我正在共同教授的课程的成绩和文档。我现在写的页面是提交作业的,学生从下拉菜单中选择一个作业,然后上传作业并提交。提交时,有关提交的所有信息都进入 MySQL 表,并且文件被移动到文件系统上的永久位置。理想情况下,这将是按作业、学生和版本高度组织的东西,但我现在只想让文件上传在原则上正常工作,所以现在它只是将东西发送到目录 ~/phptest/ (权限设置为 755,尽管我尝试 777 只是为了进行测试,但这也不起作用)。这是现在的代码:

($dbh 是我创建的扩展数据库句柄类的一个实例,以使这些特定的数据库事务更清晰)


if(isset($_POST['submit'])) {
    $assignmentID = $_POST['assID'];
    $tmp = "/home/username/phptest/"; 
    $info = pathinfo($_FILES['file']['name']);
    $filename = $info['basename'];
    $ext = $info['extension'];
    if(1) { //strcmpall($ext,array('tar.gz','zip'))) {
        if($_FILES['file']['size'] < 1000000) {
            $path = $tmp . $filename;
            if(move_uploaded_file($_FILES['file']['tmp_name'], $path)) {
                $versionQuery = $dbh->select(array('version'),array('a01_submissions'),array("studentID='$studentID'","assignmentID='$assignmentID'"));
                if(count($versionQuery)) {
                    $versionArray = $dbh->colToArray($versionQuery,'version');
                    $version = max($versionArray)+1;
                }
                else $version = 1;
                echo "Version $version.\n";
                $week = $dbh->getOne('week','a01_assignments','id',$assignmentID);
                $dbh->insert("a01_submissions",array('studentID','assignmentID','version','filePath'),array($studentID,$assignmentID,$version,addslashes($newpath)));
                echo "File $filename sucessfully uploaded and stored at $newpath.\n";
            }
            else echo $moved . "
\n"; } else die("File cannot exceed 1MB"); } else die("Bad file extension."); } else { // HTML to display the submission screen }

不过,我的问题是 move_uploaded_file 仅适用于具有 777 权限的目录。仔细检查表明这是因为 PHP 正在以用户 'apache' 的身份上传内容,因此无法使用 ow 写入我的用户名拥有的目录。我看到用户在 PHP 文档中发布的解决方案建议使用 chown 来回收文件,但我没有足够高的权限级别来执行此操作。这个问题有没有一个优雅的解决方案,不涉及尝试让我的用户名获得更高的权限?

4

2 回答 2

2

让系统管理员将您放在与 apache 相同的用户组中,或者理想情况下创建一个名为开发人员之类的新组,并将 apache 用户和您自己添加到其中。

否则,您可以在文件上传后立即尝试使用 PHP 的chmodchown函数。如果你运行chmod($filepath, 0777);它应该是一个很好的测试它是否适合你。

于 2010-08-06T08:28:39.630 回答
0

简短的回答:没有一个优雅的解决方案,因为这在概念上是错误的。文件首先归 Web 服务器用户所有是有原因的。它是创建文件的网络服务器(从操作系统的角度来看),所以他应该拥有它。

长答案:您确实希望文件归其他用户所有的原因是什么?

  1. 安全好吧,只要文件不再属于 Web 服务器,它就不能被它覆盖,所以如果攻击者接管了 Web 服务器,他或她就不能再更改分配。的确。但是,Web 应用程序不应该做 Weird Stuff™,而是应该专注于它应该做的事情,并且保护 Web 服务器肯定不是它的任务之一。一个适当的应用程序架构和一些标准的安全措施应该做同样的伎俩,并且本质上比仅仅改变文件的所有者拥有更多的安全性。如果您绝对必须移动数据,您可以使用诸如incroninotincoming 之类的工具设置监视文件夹。如果您的安全需求很高,您应该考虑在您的 Web 服务器上实现 SELinux 配置文件。
  2. 底层业务逻辑自己实现复杂的工作流程是个坏主意。如果您有关于文档处理的其他业务逻辑,我建议使用Apache CamelApache Servicemix,后者又使用 Camel,但提供了更多功能。Apache camel 是一个 Wrouting 和中介引擎”,大致翻译为“它根据Enterprise Integration Patterns处理消息。这反过来意味着它转换、拆分、丰富、路由或过滤任何给定的有效负载。有一个优秀的文件处理模块在实现业务逻辑(处理、恢复中断的处理、创建备份等)时,它会自动执行许多您必须自己处理的事情。Camel也支持 php(虽然我不建议首先使用 php,但这是完全有偏见的)。您可以将其与 incron 或 inotincoming 链接
  3. 访问您可能希望通过 ftp 访问这些文件,但不想将 ftp 用户添加到 Web 服务器组。简单的解决方案:使用“其他”权限。设置对方的权限并不是在互联网上广播文件。确保您对“其他”集具有只读权限,并且一切顺利。另一种解决方案可能是设置一个带有虚拟用户的 ftp 服务器。

底线:有一个解决方案而不破坏感觉,更不用说实施安全措施了。

于 2014-04-23T19:32:54.703 回答