1

いくつかの非常に役立つヒントに基づいて、次のコードを使用して、次のようなPHPルート ディレクトリの外部にファイルを含めています。

define('WEB_ROOT', __DIR__);
define('APP_ROOT', dirname(__DIR__));
define('PHP_ROOT', APP_ROOT . DIRECTORY_SEPARATOR . 'application');


include(PHP_ROOT . DIRECTORY_SEPARATOR . 'bootstrap.php');

私の質問はこれです。たとえば、上記のコードを含めるとしますbootstrap.php

そのPHPファイルのブートストラップに、 public_html ルート フォルダにファイルを含める独自のコード行があった場合はどうなるでしょうか。私はこれを行うのに苦労しています。ここでの私の目的は、実際のリテラルディレクトリをコードに完全に入れたくなく、ファイルトラバーサル攻撃を避けたいということです

4

2 に答える 2

5

次のプロジェクト構造を検討してください。

/path/to/projectroot/index.php
                     header.php
                     include/inc.php

index.php があった場合

include('include/inc.php');

そしてinc.phpは持っていました

include('header.php');

inc.php の行が探しているため、そのエラーが発生します。

/path/to/projectroot/include/header.php (存在しません)

いいえ

/path/to/projectroot/header.php (存在します)

人々がこれを解決する方法はいくつかあります。

1: 絶対パス

最初の最も簡単な方法は、絶対パスを使用することです。

index.php があった場合

include('include/inc.php');

そしてinc.phpは持っていました

include('/path/to/projectroot/header.php');

これはうまくいくでしょう。

2: 定義付きの絶対パス

#1 と同様、index.php が

define('PROJECT_ROOT', '/path/to/projectroot/');
include(PROJECT_ROOT.'include/inc.php');

そしてinc.phpは持っていました

include(PROJECT_ROOT.'header.php');

これはうまくいくでしょう。

更新: pichanのコメントに記載されているように、index.php で「魔法の」定数の 1 つを使用できます。

index.php

define('PROJECT_ROOT', __DIR__.'/');
include(PROJECT_ROOT.'include/inc.php');

および inc.php

include(PROJECT_ROOT.'header.php');

__DIR__次の理由から、ここに末尾のスラッシュを追加することに注意してください。

ルート ディレクトリでない限り、このディレクトリ名には末尾のスラッシュはありません。

3: 両方を含めてエラーを非表示にする

inc.php があった場合

@include('header.php');    # Try this directory
@include('../header.php'); # Try parent directory

これは機能します。[1]

4: 特に指定がない限り、現在のディレクトリを想定

index.php があった場合

$rel_prefix_to_root = '../';
include('include/inc.php');

そしてinc.phpは持っていました

if(!isset($rel_path_to_root)){ $rel_path_to_root = ''; }
include($rel_path_to_root . 'header.php');

これはうまくいくでしょう。

これらの方法に対する私の見解

1 と 2 は基本的に同じですが、1 つの定数定義を作成してサイト全体で使用できるため、2 の方が少し簡単で、大きなプロジェクトではより一般的です。また、プロジェクトを複数のサーバー (複数のパスに配置) にデプロイすることもでき、オプション 1 の各ファイルで 1 行を変更するのとは対照的に、プロジェクト全体で 1 行を変更するだけで済みます。

3 ひどいです、やらないでください。時々あなたはそれを見るでしょう、オンラインのチュートリアルでさえそれを見るかもしれません. やらないでください。

4 はおそらく 1 または 2 を優先して避けるべきです。ただし、複雑な一連のインクルードがある場合は、このアプローチが必要になる場合があります。

いくつかのメモ:

[1] これはひどい考えです。動作しますが、実行しないでください。

于 2012-07-08T15:01:01.173 に答える
-1

public_html の上のディレクトリを取得するには、次の
$aboveRoot = destroy('/public_html', $_SERVER['DOCUMENT_ROOT']);を使用します。
define('ABOVE_THE_ROOT', $aboveRoot[0]);

于 2012-07-08T15:11:27.990 に答える