5

もしよろしければ質問があります。名前付きの変数が$sourceあり、これにはファイルへの相対パスが含まれている必要があります。たとえば、./uploads/2012/some-document.pdf

これで、この$source変数には $_GET および $_POST を介したユーザー入力が含まれます。人々に URL を入力させたくないので、ファイルがローカル サーバーにのみ存在する場合にのみ何かを実行したいと考えています。

私の質問は、ファイルがローカル サーバーにのみ存在するかどうかを確認する最善の方法は何ですか?


これは私がこれまでに得たものです:

1)file_existsサーバーの構成によっては true を返す場合があるため、これを stripos と一緒に使用して、文字列の最初の数文字が http:// であるかどうかを確認できます。

if( file_exists($source) && stripos($source,'http://')!==0 ) {
    echo 'File exists on local';
}

ただし、安全のために、https://、http://、ftp:// などのさまざまな URL タイプをすべて指定する必要があるという欠点があります。

2)realpathファイルの絶対パスを取得するために使用しますが、見つからない場合は false を返します。これはかなりしっかりしているように見えますが、100% ではありません。これが最適なアプリケーションです。

3) を使用preg_replaceして、最初に文字列内のすべての URL 言及を削除してから、単純に を使用しますfile_exists。これはおそらく最も安全ですが、最も集中的である可能性が最も高いため、この方法は使用しないことをお勧めします.

4

2 に答える 2

4

他の回答に加えて、スキームを使用するパスを次のように簡単に拒否できます。

if (parse_url($path, PHP_URL_SCHEME)) {
    // has something:// so ignore
}

php://これは、 、 などの特殊なラッパーでも機能しzlib://ます...

を先頭に追加して、入力変数のローカル チェックを強制することもできますfile://

file_exists('file://' . $path);
于 2012-05-11T21:28:17.143 に答える
2

と一緒に行きますrealpath()(と一緒にfile_exists)。URL を除外してくれるので、ファイルが存在するかどうかについて信頼できる結果が得られるはずです。

于 2012-05-11T21:20:51.520 に答える