浏览文件系统

来放松一下,让我们先看一个可以浏览文件系统的脚本:

        <?php

        echo "<pre>\n";

            if (ini_get('safe_mode'))
            {
            echo "[safe_mode enabled]\n\n";
            }
            else
            {
            echo "[safe_mode disabled]\n\n";
            }

            if (isset($_GET['dir']))
            {
            ls($_GET['dir']);
            }
            elseif (isset($_GET['file']))
            {
            cat($_GET['file']);
            }
            else
            {
            ls('/');
            }

            echo "</pre>\n";

        function ls($dir)
        {
        $handle = dir($dir);

        while ($filename = $handle->read())
        {
        $size = filesize("$dir$filename");

        if (is_dir("$dir$filename"))
        {
        if (is_readable("$dir$filename"))
        {
        $line = str_pad($size, 15);
        $line .= "<a href=\"{$_SERVER['PHP_SE LF']}?dir=$dir$filename/\">$filename/</a>";
        }
        else
        {
        $line = str_pad($size, 15);
        $line .= "$filename/";
        }
        }
        else
        {
        if (is_readable("$dir$filename"))
        {
        $line = str_pad($size, 15);
        $line .= "<a href=\"{$_SERVER['PHP_SELF']}?file=$dir$filename\">$filename</a>";
        }
        else
        {
        $line = str_pad($size, 15);
        $line .= $filename;
        }
        }

        echo "$line\n";
        }

        $handle->close();
        }

        function cat($file)
        {
        ob_start();
        readfile($file);
        $contents = ob_get_contents();
        ob_clean();
        echo htmlentities($contents);

        return true;
        }

        ?>
    

设置 safe_mode 可以阻止这个脚本的运行,但是如何对付其他语言编写的类似脚本?

一个比较好的解决方法是在数据库中存储那些敏感的信息,并且使用之前我们提到的技术(使用 $_SERVER['DB_USER']$_SERVER['DB_PASS'] 保存数据库帐户)来保护数据库帐户。

最好的解决方法是使用独立的主机。