2012-05-11 9 views
5

私はもしかすると質問があります。私は$sourceという名前の変数を持っており、このは、この$source変数は$ _GETと$ _POSTを経由して、ユーザの入力が含まれています今ファイルがローカルに存在するかどうかを確認する文字列を確認する

たとえば./uploads/2012/some-document.pdfため、ファイルへの相対パスを含める必要があります。私は人々がURLを入力するのを望んでおらず、ファイルが存在する場合にのみ何かしたいですローカルサーバー上の

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


この

は、私がこれまで持っているものです:

1)file_existsは、サーバーの構成に応じて、trueを返すことがあり、私は、文字列の最初の数charatcersかどうかを確認するためにstriposと一緒にこれを使用することができますHTTPはある://そうのように://は、http://やftp://だけに

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

しかし、欠点は、私がHTTPSなどのすべての異なるURLのタイプを指定する必要があるだろうだろう安全です。

2)私はrealpathを使用してファイルの絶対パスを取得します。見つからない場合はfalseを返します。これは非常にしっかりしているようですが、100%ではないようです。

preg_replaceを使用して文字列のすべてのURLのコメントを削除してから、単にfile_existsを使用してください。これはおそらく最も安全ですが、最も集中する可能性が高く、このメソッドを使用しないことをお勧めします。

答えて

3

他の回答に加えて、あなたが単にスキームを使用するパスを拒否することができます。これはまた、などphp://zlib://、など特殊なラッパーで動作します

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

を...

file://

file_exists('file://' . $path); 
+0

これはparse_urlを使用するための優れた提案です。私はそれとfile_existsが良いと思います。ありがとう –

+0

Windowsでは、リモートファイルと組み合わせてfile_exists()とis_file()を使用すると問題が発生する可能性があります。それはWindowsのようなものをダウンロードしているようだ。 parse_url()を使い、空のホストをチェックしてください。 – redaxmedia

2

realpath()file_existsと併せて)に移動してください。それはあなたのためのURLをフィルターに掛け、ファイルが存在するかどうかの確かな信頼できる結果を得なければなりません。

+0

これらの2つを組み合わせるとは思わなかったので、入力変数のローカルチェックを強制することもできます。彼らはうまく一緒に働くと思います。 Cheers –

関連する問題