我的网络应用程序有很多模块。每个模块都有一个“主”php 脚本,该脚本根据发送到主模块的查询加载子模块:
//file: clientes.php
//check for valid user...
//import CSS and JS...
switch( $_GET["action"] )
{
case "lista" : require_once("clientes.lista.php"); break;
case "listaDeudores" : require_once("clientes.listaDeudores.php"); break;
case "nuevo" : require_once("clientes.nuevo.php"); break;
case "detalles" : require_once("clientes.detalles.php"); break;
case "editar" : require_once("clientes.editar.php"); break;
default : echo "<h1>Error</h1><p>El sitio ha encontrado un error.</p>";
}
该主模块处理安全性并导入所有子模块所需的许多资源。当用户请求任何子模块时,绕过主模块上的所有安全措施,就会出现大问题!我的想法是在每个子模块上添加一行来测试它是否被直接调用并拒绝访问,或者是否通过另一个脚本调用,然后继续。我最不想做的事情是对每个文件重新进行安全检查,因为它会对数据库进行大量查询。
php 脚本是否知道它是否是通过require_once()
还是直接打电话?我一直在尝试实施某种$_SERVER['REQUEST_URI']
and $_SERVER['PHP_SELF']
陷阱,但我想知道是否有某种优雅的方法可以做到这一点。
我正在寻找一种方法来确定文件是否已被包含或直接调用,所有这些都来自文件内部。在我的探索中的某个时刻,我经历了这条线索。通过检查 PHP 手册中的本网站以及其他网站和页面上的各种其他线程,我得到了启发并想出了这段代码:
if ( basename(__FILE__) == basename($_SERVER["SCRIPT_FILENAME"]) ) {
echo "called directly";
}
else {
echo "included/required"
}
本质上,它比较当前文件(可以包含的文件)的名称是否与正在执行的文件相同。
解释:
__FILE__ 是一个 PHP 魔法常量,它存储文件的完整路径和文件名,它的美妙之处在于,如果文件已被包含或需要,它仍然返回该文件(包含的文件)的完整路径和文件名。
(魔法常量手册:http://php.net/manual/en/language.constants.predefined.php)
$_SERVER["SCRIPT_FILENAME"] 返回当前正在执行的脚本的绝对路径名。当包含/需要一个文件时,它不会执行(只是包含),它返回(比方说)“父”文件(包含另一个文件和执行的文件的文件)的路径名。
basename(string $path) 是一个返回路径的尾随名称部分的函数,在本例中是文件名。您也可以只比较完整路径和文件名,这确实会更好,实际上没有必要使用此功能,但这样感觉更干净,jajaj。
(基本名称():http://php.net/manual/en/function.basename.php)
我知道现在回答主要问题有点晚了,但我猜这对那些和我有同样情况并且也经过的人来说可能会有用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)