如何防止直接访问文件夹中的文件?

时间:2019-02-16 19:36:18

标签: php

A有一个网页,其中的“ subdir” 具有以下结构:

  • 我的网页
    • / subdir / system / -这是php表单文件,
  • index.php

index.php在/ system中调用file1.php。然后/ system中的其他文件被“提交”调用。 我无法编写正确的 .htaccess 来阻止直接通过其URL调用这些 / system /

我用Google搜索并尝试了各种 .htaccess 内容。但是大部分“ subdir” 根本无法访问(甚至不能从 index.php 访问),或者“网页” 访问返回< strong>“ 404” 。

通常,用户应打开 index.php 并决定要执行的操作。因此,他被重定向到相应的 / system / .php。 任何其他尝试/例如添加https://mywebpage/subdir/system/ anyfile 。应该将他重定向回index.php或其他任何“错误页面”。

1 个答案:

答案 0 :(得分:2)

典型的方法是在入口点(如index.php)中定义一个先于其他文件运行的全局常量,然后检查每个文件中是否定义了该常量

 define('SOME_CONST', true);

然后在每个文件的顶部

if(!defined('SOME_CONST')) die ("No direct access");

因此在不首先加载定义常量的文件的情况下访问文件会导致PHP终止。

这个“常量”可以是任何东西,通常我使用相对于index.php文件等的基本路径。

    define('MY_BASE_PATH', __DIR__.'/');

依此类推...

需要记住的几件事

我应该提一下,您不应该在文件中定义它,而应该将其包含在其他文件中,那样就行不通了。

   //DO NOT DO THIS as IT wont WORK!!!!! - technically it never fails
  //--- in the file somefile.php ---

  //required file defines SOME_CONST
  require 'index.php'; 
  //define('SOME_CONST', true); -- defined in index.php, think of it like copy and pasting that files code at this spot.

  //will never fail, because it's defined by the file included/required above
  if(!defined('SOME_CONST')) die ("No direct access"); 

这就像将其放入您的代码中并期望它会失败(显然,这里永远不会失败):

  //dont do this either
  define('SOME_CONST', true);
  if(!defined('SOME_CONST')) die ("No direct access"); 

相反,请这样做:

因此,您必须包括来自该入口点的文件,并使用诸如路由器之类的东西……基本的MVC。改为这样做(大大简化了)

 // --- in index.php ---
define('SOME_CONST', true);

require 'somepage.php';
//if(!defined('SOME_CONST')) die ("No direct access"); included in the above require

然后

//--- in somefile.php ---
if(!defined('SOME_CONST')) die ("No direct access"); //will fail if index.php is not loaded.

因此,如果有人只去somefile.php,则该常量未定义。因为index.php尚未在该文件“之前”执行。...如果您在检查之前包括index.php(在somefile.php中,则不喜欢。您显然不能在检查后包括它(index.php)。因此它必须在somefile.php之前运行,而不是仅加载somefile.php时运行。这就是为什么您不能在index.php中包含somefile.php,而必须在somefile.php中包含index.php的原因。

显然,您将需要多于一页的somefile.php。因此,在索引中,您将需要一种将请求定向到正确页面的方法。这称为路由。这是另一个主题...

我试图使它尽可能基本。真的很简单。

享受。