文件系统和安全性(PHP)

时间:2010-05-22 10:55:17

标签: php security

考虑一个用PHP编写的简单文件上传系统。用户只能在管理面板中访问。 (不是FTP)。出于安全问题,他可能会将文件夹选项从707更改为755。 怎么办呢?我们可以从上传脚本执行此操作吗?如果是,这是一个安全的应用程序吗?

4 个答案:

答案 0 :(得分:3)

您可以使用chmod。每个文件系统操作都有运行风险,因此请考虑用户可能尝试更改其他文件的权限,以便您 来清理输入。

bool chmod  (  string $filename  ,  int $mode  )
  

尝试改变模式   指定文件到模式中给出的文件。

答案 1 :(得分:2)

我们在上传脚本时无法做到这一点,这不是任何人都可以破解它的安全方式。 我只能在文件上传页面代码中通过ftp提供chmod来完成。

答案 2 :(得分:2)

此脚本会删除所有脏东西并检查目录中的白色文件列表。如果文件存在于目录中,则结果为true,否则为黑客攻击

function WhitePage($page) {

        $info2 = apache_lookup_uri('src/index.php?p=' . $page);

        list($arg, $val) = explode("=", $info2->args);

        $myrequest = basename(htmlspecialchars_decode($val));

        return $myrequest;
    }

    function Read_Dir($dir, $array = array()) {
        $dh = opendir($dir);
        $files = array();
        while (($file = readdir($dh)) !== false) {
            $flag = false;
            if ($file !== '.' && $file !== '..' && !in_array($file, $array)) {
                $files[] = trim($file);
            }
        }
        return $files;
    }

    function WhiteList($page = null) {
        $info2 = apache_lookup_uri('src/index.php?p=' . $page);
        list($arg, $val) = explode("=", $info2->args);
        // basename from the std class
        $myrequest = basename(htmlspecialchars_decode($val));

        $myrequest = trim($myrequest . '.php');
        //pathinfo from the std class
        $path = pathinfo($info2->filename);
        // get the files array
        $whitefiles = Read_Dir($path['dirname']);

        if (in_array($myrequest, $whitefiles, true)) {

            $res = 1;
        } else {

            $res = 0;
        }
        return $res;
    }

    // this is solution of this kind of the problems
    //$p='index.php?p=../../../../../../../../etc/passwd%00index.html';
    $p = '../../../../../../../../etc/passwd%00index.html';
    $p = WhitePage($p);
    $result = WhiteList($p);

    if ($result) {
        echo 'ok';
    } else {
        echo 'Die ,You evil hacker';
    }

答案 3 :(得分:0)

看起来你不了解网络服务器的工作方式。它只有一个system user ans,无需更改site users的任何权限。

要实现ACL功能,需要一个数据库来保存用户和权限,以及一些手动下载方法实现,一个简单的(正确的头文件+ readfile())或一个更复杂的解决方案,如nginx的x_accel_redirect