如何检测文件是否被包含或直接运行

GUI*_*psp 4 php include

我有一个php文件,我包含在我的PHP脚本中,但我不希望人们能够直接运行该文件(不包括在内).我怎样才能防止这种情况发生?

Thi*_*ter 5

使所包含的脚本无法通过HTTP访问.例如,通过保护子文件夹或将它们移动到文档根目录之上.

如果你不能这样做,define()就像IS_INCLUDED你的主脚本中的东西,exit;如果这个常量不在defined()你的包含脚本中.


tim*_*tim 5

检查脚本是否是 PHP 进程的父进程可能不是防止用户直接请求包含文件的最佳方法。但它在许多其他情况下也很方便,例如 AJAX 模块等。我不会通过这个开始一个新主题。

if (__FILE__ == get_included_files()[0])
// Doesn't work with PHP prepend unless calling [1] instead.

if (__FILE__ == $_SERVER['DOCUMENT_ROOT'] . $_SERVER['SCRIPT_FILENAME'])
// May not work on Windows due to mixed DIRECTORY_SEPARATOR (machine specific)

if (basename(__FILE__) == basename($_SERVER['SCRIPT_FILENAME']))
// Doesn't work with files with the same basename but different paths

if (defined('FLAG_FROM_A_PARENT'))
// Works in all scenarios but I personally dislike this

if (realpath(__FILE__) == realpath($_SERVER['DOCUMENT_ROOT'] . $_SERVER['SCRIPT_FILENAME']))
// Should work flawlessly
Run Code Online (Sandbox Code Playgroud)

请记住,某些使用虚拟路径的机器可能会在不同的 php 组件中返回不同的路径。realpath() 是您的朋友。