对于我的项目,我创建了一个名为DBAccess的文件夹,其中包含所有与PHP类,常量函数等数据库相关的PHP文件。在文件夹的外部,我创建了一个名为DBAccess.php的php文件。 以下是我的目录结构简而言之
Project1
|_DBAccess
| |_functions.php
| |_class.php
| |_constants.php
|_DBAccess.php
|_index.php
|_aboutus.php
.......
现在我希望限制根目录中的任何页面使用除DBAccess.php文件之外的DBAccess文件夹的内容。它是否可以在PHP中使用.htaccess或其他东西?
答案 0 :(得分:3)
你可以这样做:
DebugAccess / foo.php
<?php
$trace = debug_backtrace();
if (isset($trace[0])) {
$dir = basename(dirname($trace[0]['file']));
$file = basename($trace[0]['file']);
if ($file != 'DBAccess.php' && $dir != 'DBAccess') {
throw new Exception("Nice try butthead");
}
}
echo "Access Granted\n";
DBAccess.php
<?php
include_once("DBAccess/foo.php");
NoDBAccess.php
<?php
include_once("DBAccess/foo.php");
> php DBAccess.php
Access Granted
> php NoDBAccess.php
Fatal error: Uncaught exception 'Exception' with message 'Nice try butthead' in /Users/seanberry/so/DBAccess/foo.php:7
Stack trace:
#0 /Users/seanberry/so/NoDBAccess.php(3): include_once()
#1 {main}
答案 1 :(得分:1)
您可以创建一个处理此问题的函数,您所要做的就是在_DBAccess.php或您需要访问这些文件的任何其他文件中调用该函数。
尝试此功能:
function include_all_php($folder){
foreach (glob("{$folder}/*.php") as $filename)
{
require $filename;
}
}
然后你只需要用foldername调用该函数。
include_all_php("_DBAccess")
如果您希望文件不包含这些文件,则不要求它们:)
答案 2 :(得分:0)
是的,你可以:
a)通过在DBAccess.php中定义全局变量,例如
define('DB_LIB',true)
并在文件夹中的所有其他文件中使用DB_LIB常量
(bit cheep trick但这可以确保不会直接访问这些文件)
b)通过定义class as final
来停止继承间接回答问题
c)停止重新发明轮子(如果您正在创建一个访问层,如您的示例所示) 并使用现有的PDO
d)使用一些合适的OO设计模式e.g并检查this also。 你的反应是什么原因?因为使用模式会修复许多继承和依赖性问题,例如在访问层的情况下,子对象将不会被实例化,除非它不是用依赖对象创建的,例如工厂案例
的用户答案 3 :(得分:0)
.htaccess
与PHP无关,它是Apache Web服务器的设置文件。 Apache无法阻止PHP代码读取磁盘上的文件。
您可以通过例如要求定义某个常量来阻止意外访问:
// DBAccess.php
define('CAN_ACCESS_DB', true);
// functions.php
if( !defined('CAN_ACCESS_DB') ){
die('You are not allowed to access this file');
}
......但是没有办法阻止故意访问。
你最好的机会可能是重新考虑你的设计。