【发布时间】:2015-08-22 20:17:17
【问题描述】:
我在一堆 php 项目中克服了这种安全措施。在每个 php 文件的顶部,检查脚本是通过直接访问(例如通过浏览器)调用还是站点入口点正确包含/需要它:
if(!defined('SYSTEM_ENTRYPOINT'))
die();
这是在 php 项目中使用的好习惯吗?这样做时我应该考虑什么?有边缘情况吗?如果不检查,可能会暴露哪些数据?
【问题讨论】:
-
如果你所有的 php 文件都在 webroot 之外并且你只在 webroot 中公开入口点,我相信你不会需要它。
-
@frz3993 在我目前的情况下,一切都在一个地方。
-
好的。然后,这取决于您在文件中的内容。假设一个文件只包含变量还是只包含类。直接调用它只会产生一个空白页。如果你在文件中有一些指令,它们肯定会被执行。
-
视情况而定,但 99% 的文件只包含类。您会说仅在具有“直接代码”的文件中进行检查才有意义吗?恐怕 php 错误消息中的信息可能会帮助可能的攻击者窥探或获取有关项目结构的其他信息。
-
我想是的,只有“直接代码”才有意义。是的,错误消息可以说明很多关于结构的信息,例如,如果您的入口点未能包含文件,则错误消息将显示文件的路径,即使您进行了检查。如果您直接导航到类文件,则不会显示任何错误,因为它不处理任何内容。在生产中,通常我会重定向到错误页面并记录或邮寄错误。永远不要让错误出现。