【问题标题】:Termination on direct script access终止直接脚本访问
【发布时间】:2015-08-22 20:17:17
【问题描述】:

我在一堆 php 项目中克服了这种安全措施。在每个 php 文件的顶部,检查脚本是通过直接访问(例如通过浏览器)调用还是站点入口点正确包含/需要它:

if(!defined('SYSTEM_ENTRYPOINT'))
    die();

这是在 php 项目中使用的好习惯吗?这样做时我应该考虑什么?有边缘情况吗?如果不检查,可能会暴露哪些数据?

【问题讨论】:

  • 如果你所有的 php 文件都在 webroot 之外并且你只在 webroot 中公开入口点,我相信你不会需要它。
  • @frz3993 在我目前的情况下,一切都在一个地方。
  • 好的。然后,这取决于您在文件中的内容。假设一个文件只包含变量还是只包含类。直接调用它只会产生一个空白页。如果你在文件中有一些指令,它们肯定会被执行。
  • 视情况而定,但 99% 的文件只包含类。您会说仅在具有“直接代码”的文件中进行检查才有意义吗?恐怕 php 错误消息中的信息可能会帮助可能的攻击者窥探或获取有关项目结构的其他信息。
  • 我想是的,只有“直接代码”才有意义。是的,错误消息可以说明很多关于结构的信息,例如,如果您的入口点未能包含文件,则错误消息将显示文件的路径,即使您进行了检查。如果您直接导航到类文件,则不会显示任何错误,因为它不处理任何内容。在生产中,通常我会重定向到错误页面并记录或邮寄错误。永远不要让错误出现。

标签: php security web


【解决方案1】:

您应该通过 URL 重写来处理这个问题。以某种方式组织您的 php 文件,以便访问者无法触及您的程序逻辑。

例如,将您的代码分成两个目录:web 和 src。 Web ahould contian only index.php ant htaccess 文件将所有请求路由到它。 src 应该是所有程序逻辑(控制器、db 访问 abd 等等)。在 src/index.php 中,编写一些逻辑来决定要包含 src 文件夹中的哪个控制器。

将“web”目录设为您网站的 web 根目录,访问者将无法访问任何其他 php 文件。

【讨论】:

  • 这将是一个解决方案,我之前也考虑过这个问题。我使用常量来定义我的源的几个重要位置,所以这没什么大不了的。我现在会接受这个作为答案,但也许对最初的想法还有一些贡献。
  • 如果可能,将您的虚拟主机(Apache、nginx)配置为指向public/ 目录,并将所有应用程序代码和特别是配置文件保存在此目录之外。即/var/www/public/var/www/src
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-04-02
  • 2011-02-10
  • 2022-11-28
  • 1970-01-01
  • 2014-10-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多