3

次のことを行うための安全な方法を見つけようとしています。

  1. ユーザーは値を html フォームに入力します。
  2. フォームが送信されます。
  3. PHP は、送信された値を「scandir」関数の引数として使用します。

私の理論は、絶対パスを禁止し、ディレクトリ名に特定の値を含める必要があるphpスクリプトにロジックを含めることです。

私の懸念は、ハッカーが私のフォームを使用して自分の値を送信し、機密ファイルにアクセスできることです。

これは JQuery プラグイン用です。ユーザーが PHP ファイルを変更する必要はありません。

以下のコードはどのようにハッキングされる可能性がありますか?

<?php

$foo = $_POST["some_directory"];

//validate $foo

//make sure path to directory is relative
$foo_url_test  = parse_url($foo);
if (isset($foo_url_test['scheme']) || isset($foo_url_test['host'])) {
$foo = NULL;
}

//make sure the directory name contains 'bar123'
$foo_name_test = preg_split('_[\\\\/]_', $foo);
$foo_name_test = end($foo_name_test);
$foo_name_test = strpos($foo_name_test,'bar123');
if ($foo_name_test === false) {
$foo = NULL;
}

//make sure the path does not contain '..'
$foo_dot_dot_test = strpos($foo,'..');
if ($foo_dot_dot_test == TRUE || $foo_dot_dot_test === 0) {
$foo = NULL;
}

//get files
$files_array = scandir($foo);

?>
4

3 に答える 3

2

realpath()を見たいと思うかもしれません。

$foo = realpath($foo);
if (substr($foo, 0, 8) != '/my/path') {
    return false;
}

……とか、そんなこと。

于 2009-07-01T02:11:24.183 に答える
1

おそらく、このスクリプトの目的と、スクリプトが任意のディレクトリを読み込もうとする理由について、さらに詳しく説明する必要があります。この知識がなければ、このコードのセキュリティについてコメントすることは困難ですが、アクセス可能なディレクトリに明確な制限がなければ、非常に危険なことであると指摘することはできません。

私は、たとえば、リモートの攻撃者が読み取るディレクトリを指定できるようにする PHP スクリプトをサーバーにインストールしたり、特定のファイルやディレクトリが存在するかどうかを確認したりすることは決してありません。

サーバー所有者が、このスクリプトによって開くことが許可されている一連のディレクトリをホワイトリストに登録できるようにする、php によって読み取られる構成ファイルを編集することをユーザーに要求することについては、強力な議論があります。

OPからの返信後に更新

ここでの問題は、すべての「ajax」リクエストがブラウザによって直接行われることです。これは、Ajax 要求を行う HTML ページに Web サーバーが設定するデータが悪意のあるユーザーによって上書きされる可能性があることを意味します。あなたの ajax リクエストは、別の方法で保護しない限り、任意のパラメーターを使用していつでも誰でも行うことができます。

データがサーバーを離れるとすぐに、信頼できなくなります。これを安全にする最善の方法は、サーバー側で許可されたディレクトリのホワイトリストを保持することです。許可リストにないディレクトリ (または許可リスト内のサブディレクトリにないディレクトリ) に対する要求を受け取った場合は、要求を拒否し、標準エラー応答を返します。

于 2009-07-01T10:16:51.760 に答える
0

ディレクトリ名には..要素を含めることができるため、制限しようとしている現在の作業ディレクトリの外を見ることができます。ただし、意図した名前のディレクトリしか見ることができません。

FWIW、parse_url()ディレクトリ名が相対的かどうかを分析するために使用するのは本当に奇妙です。探してみません$foo[0] == '/'か?

(もちろん、これは Unix パス規則を前提としていますが、コードは既にそれを行っています。)

于 2009-07-01T01:50:34.383 に答える