2

私はphpを使用しており、絶対パスをURLに変換する次のコードがあります。

function make_url($path, $secure = false){
    return (!$secure ? 'http://' : 'https://').str_replace($_SERVER['DOCUMENT_ROOT'], $_SERVER['HTTP_HOST'], $path);
}

私の質問は基本的に、ロケーションとサーバー間で移植可能なセキュリティ/信頼性の観点からこれを行うためのより良い方法はありますか?

4

3 に答える 3

2

これがURLであり、ブラウザに出力されるという理由だけで、セキュリティが影響を受けるとは思いません...最悪の場合、ファイルへの完全なディレクトリパスが公開され、壊れたリンクが作成される可能性があります.

ちょっとした補足として、これが HTML ドキュメントに印刷されている場合、htmlentities のようなものを介して出力を渡していると思います... 入力 $path に [script] タグ (XSS) のようなものが含まれている場合に備えて。

ただし、これをもう少し信頼できるものにするために、「DOCUMENT_ROOT」でのマッチングはお勧めしません。設定されていないか、一致しない場合があるためです (たとえば、Apache の書き換えルールが邪魔をし始めた場合)。

書き直すとしたら、「HTTP_HOST」が常に出力されるようにするだけです...

function make_url($path, $secure = false){
    return (!$secure ? 'http://' : 'https://').$_SERVER['HTTP_HOST'].str_replace($_SERVER['DOCUMENT_ROOT'], '', $path);
}

...そして可能であれば、パスを渡すだけになるように呼び出しコードを更新してください. .

function make_url($path, $secure = false){
    return (!$secure ? 'http://' : 'https://').$_SERVER['HTTP_HOST'].$path;
}

疑問が残るのはどれですか...なぜこの機能があるのですか?

私の Web サイトでは、スクリプト実行の開始時に変数を定義して、次のように設定します。

$GLOBALS['webDomain'] = 'http://' . (isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : '');
$GLOBALS['webDomainSSL'] = $GLOBALS['webDomain'];

GLOBALS を使用しているので、どこからでもアクセスできます (関数内など)...ただし、この値が変更されないことがわかっている場合は、定数を作成 (定義) することを検討することもできます (後でこれらの値を後で変更することがあります)。サイト全体の構成ファイル (たとえば、Web サイト用の HTTPS/SSL 証明書がある場合)。

于 2008-12-17T08:23:11.170 に答える
2

HTTP_HOST 変数は、クライアントからも送信されるため、信頼できる値でも安全な値でもありません。そのため、使用する前に必ずその値を検証してください。

于 2009-01-09T15:28:38.793 に答える
0

これは間違ったアプローチだと思います。

HTML の URL は相対位置をサポートします。つまり<A href="filename.php">link</a>、該当するページと同じ URL のパスを持つページを参照することができます。<a href="/dir/filename.php">link</a>同じ Web サイトへの完全なパスを提供することもできます。これら 2 つのトリックにより、Web サイトのコードは、機能する URL を提供するためにどこにあるかを知る必要がありません。

とはいえ、ある Web サイトを にhttp://www.example.com/dev/site.php、別のWeb サイトを に持つには、いくつかのトリックが必要になる場合がありますhttp://www.example.com/testing/site.php。どのディレクトリプレフィックスが使用されているかを把握するためにいくつかのコードが必要になりますが、構成値を使用してそれを行うことができます。これは、バージョン管理されたコードではなく、その (サブ) サイトの構成に属する値を意味します!

于 2008-12-18T00:41:25.610 に答える