我本来想问最好的方法是什么,但后来决定我应该问是否有必要。我从未见过它在JSP
开发中完成,但它似乎是PHP
. 这背后的原因是什么,如果我不防范这种情况,我还应该考虑什么?
8 回答
这在 PHP 中比其他类似语言更常见的原因与 PHP 的历史有关。早期版本的 PHP 将“register_globals”设置作为默认设置(事实上,在早期版本中它甚至可能不是一个设置)。Register_globals 告诉 PHP 根据查询字符串定义全局变量。因此,如果您这样查询这样的脚本:
http://site.com/script.php?hello=world&foo=bar
...脚本会自动定义一个变量 $hello ,其值为“world”,$foo 的值为“bar”。
对于这样的脚本,如果您知道关键变量的名称,则可以通过在查询字符串中指定这些变量来利用该脚本。解决方案?在核心脚本中定义一些魔术字符串,然后让所有辅助脚本检查魔术字符串,如果不存在则退出。
值得庆幸的是,几乎没有人再使用 register_variables 了,但是许多脚本仍然写得非常糟糕,并且做出愚蠢的假设,如果它们被断章取义地调用它们会造成损害。
就个人而言,我通过使用 Symfony 框架来避免整个事情,它(至少在其默认设置中)将控制器和模板完全排除在 Web 根目录之外。唯一的入口点是前端控制器。
如果您包含来自外部 Web 根目录的所有内容,那么这不是问题,因为无法直接加载任何内容。
嗯,这是为了防止敏感的包含被直接发送到网络服务器。这当然不是一个包罗万象的安全措施,但它可以帮助您的特定设置。
但是,如果您的用户能够从他们自己的脚本中包含该文件,那将毫无帮助
我发出一个 404 页面,不是作为一项严肃的安全措施,而只是因为我不喜欢泄露有关网站内部的信息,甚至是内部文件的名称。
但是如果文件只包含函数,那么省略检查并没有真正的危害。
它也不仅仅是 php 中的一个安全功能,而是更多基于 MVC 的 PHP 站点的功能。例如,如果在 SugarCRM 中您要直接调用模块文件,则页面加载将失败,因为控制器、视图和模型之前未加载,并且您也没有数据库配置/连接信息,因此要确保加载所有依赖项用户被迫通过一个已知的入口点 - 即 index.php
我刚刚在 .Net MVC 系统中找到了一种方法,您可以使用 Apache Rewrites、.htaccess 文件或者如果您使用的是 IIS,则可以为 PHP 复制该方法,如果您使用的是 web.config 文件。
由于 MVC 模式不需要用户直接访问 aspx 文件,因此不提供这些文件,而是发送 404。例如,如果您有包含文件“inc.php”的命名约定,您可以将 *.inc.php 请求重定向到特定文件夹的 404 - 在 Apache Rewrite 中,规则末尾的 R=404 将返回该 HTTP 状态给你的客户。
其中一些示例可能会有所帮助:Apache Rewrite Examples
正如其他一些答案中已经提到的那样,您不需要这样做。如果文件不应该由 Web 服务器提供,则不应将其留在 Web 文件夹中。包含应放置在 Web 根目录之外的目录中。
除此之外,告诉用户页面不存在的正确方法是发出状态 404,使用:
header("HTTP/1.0 404 Not Found");
exit;
如果您不这样做,非人类(例如搜索引擎)很难区分常规页面和非页面。
这非常重要,因为如果您正在编辑运行 Google 工具栏的网站,它会找到您的内部 php 文件,然后将它们放入搜索结果中。充其量这会给用户带来尴尬的体验,但如果你是一个草率的程序员,可能会泄露数据库连接信息。