1

我本来想问最好的方法是什么,但后来决定我应该问是否有必要。我从未见过它在JSP开发中完成,但它似乎是PHP. 这背后的原因是什么,如果我不防范这种情况,我还应该考虑什么?

4

8 回答 8

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 根目录之外。唯一的入口点是前端控制器。

于 2008-09-21T02:17:47.127 回答
2

如果您包含来自外部 Web 根目录的所有内容,那么这不是问题,因为无法直接加载任何内容。

于 2008-09-21T04:58:52.700 回答
1

嗯,这是为了防止敏感的包含被直接发送到网络服务器。这当然不是一个包罗万象的安全措施,但它可以帮助您的特定设置。

但是,如果您的用户能够从他们自己的脚本中包含该文件,那将毫无帮助

于 2008-09-20T14:30:21.227 回答
1

我发出一个 404 页面,不是作为一项严肃的安全措施,而只是因为我不喜欢泄露有关网站内部的信息,甚至是内部文件的名称。

但是如果文件只包含函数,那么省略检查并没有真正的危害。

于 2008-09-20T14:38:48.227 回答
0

它也不仅仅是 php 中的一个安全功能,而是更多基于 MVC 的 PHP 站点的功能。例如,如果在 SugarCRM 中您要直接调用模块文件,则页面加载将失败,因为控制器、视图和模型之前未加载,并且您也没有数据库配置/连接信息,因此要确保加载所有依赖项用户被迫通过一个已知的入口点 - 即 index.php

于 2008-09-20T14:33:47.803 回答
0

我刚刚在 .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

于 2008-09-20T15:26:50.203 回答
0

正如其他一些答案中已经提到的那样,您不需要这样做。如果文件不应该由 Web 服务器提供,则不应将其留在 Web 文件夹中。包含应放置在 Web 根目录之外的目录中。

除此之外,告诉用户页面不存在的正确方法是发出状态 404,使用:

header("HTTP/1.0 404 Not Found");
exit;

如果您不这样做,非人类(例如搜索引擎)很难区分常规页面和非页面。

于 2008-09-21T11:02:31.717 回答
0

这非常重要,因为如果您正在编辑运行 Google 工具栏的网站,它会找到您的内部 php 文件,然后将它们放入搜索结果中。充其量这会给用户带来尴尬的体验,但如果你是一个草率的程序员,可能会泄露数据库连接信息。

于 2009-02-19T15:16:45.303 回答