16.4.3 代码组织
有些开发人员认为,互联网上任何不能被用户直接访问的文件都不应该保存在Web站点的文档根目录。例如,如果消息公布板站点的文档根目录位于/home/httpd/message-board/www,应该将所有引入文件以及为站点编写的其他文件保存在其他位置,例如/home/httpd/messageboard/code。这样,在代码中,当需要引入这些文件时,可以使用如下所示代码:
require_once('../code/user_object.php);
这样做的原因是当一个恶意用户请求一个非.php或.html文件时可能会发生的状况。在默认情况下,许多Web服务器将那个文件的内容导出到输出流。因此,如果打算在公共文档根目录保存user_object.php文件,而用户又要请求该文件,该用户可能会在Web浏览器中看到完整的代码。这就会让用户看到我们的代码实现,获取这个文件中的任何知识产权以及可能找到我们忽略的漏洞。
要避免这种情况,我们应该确保Web服务器被配置为只允许请求.php和.html文件,而对其他类型文件的请求必须返回错误。
同样的,任何其他文件,例如密码文件、文本文件、配置文件或特殊目录,都必须与公共文档根目录隔离。即使认为已经正确地配置了Web服务器,我们也可以忽略了某些问题,或者,在将来,Web应用转移到一个未正确配置的新服务器,我们可能就会暴露一些漏洞。
如果在php.ini文件启用了allow_url_fopen选项,理论上,我们可以引入或请求远程服务器的文件。这可能是我们应用的另一个安全失误,因此应该避免引入其他机器上的文件,尤其是那些我们并没有完全控制的机器。同样的,在选择需要引入或请求那个文件时,不能使用用户输入,因为糟糕的输入也会导致问题。