php7中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 "

Error

El sitio ha encontrado un error.

";

}

该主要模块处理安全性并导入所有子模块所需的许多资源.当用户请求任何子模块时,会出现一个大问题,绕过主模块上的所有安全措施!我的想法是在每个子模块上添加一行来测试它是否被直接调用并拒绝访问,或者是否通过另一个脚本调用它,并继续.我想做的最少的事情是重做每个文件的安全检查,因为它对数据库进行了大量的查询.

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值