1

对于我的项目,我创建了一个名为 DBAccess 的文件夹,其中包含所有与数据库相关的 PHP 文件,这些文件具有 PHP 类、常量函数等。在文件夹的外部,我创建了一个名为 DBAccess.php 的 php 文件。以下是我的目录结构

Project1
  |_DBAccess
  |       |_functions.php
  |       |_class.php
  |       |_constants.php         
  |_DBAccess.php
  |_index.php
  |_aboutus.php  
    .......

现在我希望限制根目录中的任何页面使用 DBAccess 文件夹的内容,除了 DBAccess.php 文件。在 PHP 中是否可以使用 .htaccess 或其他东西?

4

4 回答 4

3

你可以这样做:

调试访问/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}
于 2013-01-04T08:49:12.073 回答
1

您可以创建一个处理此问题的函数,您所要做的就是在 _DBAccess.php 或您需要访问这些文件的任何其他文件中调用该函数。

试试这个功能:

function include_all_php($folder){
    foreach (glob("{$folder}/*.php") as $filename)
    {
        require $filename;
    }
}

然后您只需使用文件夹名称调用该函数。

include_all_php("_DBAccess")

如果您希望文件不包含这些文件,则不需要它们:)

于 2013-01-04T08:44:42.673 回答
0

是的你可以 :

a) 通过在 DBAccess.php 中定义一个全局变量,例如

define('DB_LIB',true)

并在文件夹中的所有其他文件中使用 DB_LIB 常量

(有点小技巧,但这确保了这些文件不会脱离上下文直接访问)

b) 通过将类定义为 final来停止继承

间接回答问题

c) 停止重新发明轮子(如果您按照示例建议创建访问层)并使用已经存在的一个PDO

d) 使用一些合适的 OO 设计模式,例如并检查这一点。你的反应会是为什么?因为使用模式将解决许多继承和依赖问题,例如在访问层的情况下,子对象将不会被实例化,除非它不是用依赖对象创建的,例如在工厂情况下

f) 使用public 、 private 和 protected 关键字

于 2013-01-04T08:44:22.250 回答
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');
    }
    

    ...但是没有办法阻止故意访问。

你最好的机会可能是重新考虑你的设计。

于 2013-01-04T08:48:58.237 回答