编程语言
首页 > 编程语言> > 如何知道php脚本是否通过require_once()调用?

如何知道php脚本是否通过require_once()调用?

作者:互联网

我的webapp有很多模块.每个模块都有一个’main’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’]和$_SERVER [‘PHP_SELF’]陷阱,但我想知道是否有某种优雅的方式来做这件事.

解决方法:

一种优雅的方法是将所有文件放在Web目录之外,只能通过include访问.

假设您的web目录是/ foo / www /,创建一个包含目录/ foo / includes并在include_path中设置它:

$root = '/foo';
$webroot = $root.'/www'; // in case you need it on day
$lib = $root.'/includes';
// this add your library at the end of the current include_path
set_include_path(get_include_path() . PATH_SEPARATOR . $lib); 

然后,没有人能够直接访问您的库.

你可以做很多其他事情(设置测试全局变量,只使用库中的类等),但这个是最安全的.您的DocumentRoot中没有的每个文件都无法通过URL访问.但这并不意味着PHP无法访问此文件(如果您没有为空,请检查您的open_basedir配置,以允许您的include dir).

您在web目录中真正需要的唯一文件是我们称之为bootstrap(index.php),具有良好的重写规则或良好的url管理,您可以将应用程序上的所有请求限制到此文件,这将是一个很好的安全起点.

标签:require-once,php
来源: https://codeday.me/bug/20191007/1864875.html