is_uploaded_file()の目的は何ですか?

ドキュメントは言う:

filenameで指定されたファイルがHTTP POST経由でアップロードされた場合はTRUEを返します。

$ _ FILES ['blah'] ['tmp_name'] はPOSTアップロードの結果ではない可能性がありますか? PHPがこのファイル名を作成しました。

これは、悪意のあるユーザーが試していないことを確認するのに役立ちます   スクリプトは、それが存在してはならないファイルを処理するようにトリックします。   たとえば、/ etc/passwdのように動作します。

ファイルの内容とサイズを慎重に確認する必要があることを理解しています。しかし、どのように攻撃者がアップロードされたファイルの一時ファイル名を制御することができますか?

または、 is_uploaded_file()は他のチェックを行いますか?

いくつかの光を放出していただきありがとうございます。

18
修正: is_upload_file()ではなく is_upload_file()
追加された 著者 MacMac,
@マリオ:いいえ、それは全く冗長ではありません。なぜなら、あなたは他人と一緒に電話しなければならないからです。それらを孤立して使用することができます。
追加された 著者 Lightness Races in Orbit,
move_uploaded_file()はまったく同じチェックをやり直すので冗長です。
追加された 著者 mario,
$ _FILES配列を自分で設定していた場合はfalseを返すので、スーパーグローバルを設定するだけで要求を偽装するのが難しくなり、デバッグが難しくなります。
追加された 著者 timwaagh,

3 答え

現在の形式では、 is_uploaded_file はファイルのアップロードが有効かどうかをチェックします(そうでなければ、アップロードされたファイルではない)、提供されたファイル名がPHPによって生成されています)。

アップロード中に問題がなければ、これは本当に役に立ちません。

is_uploaded_file($_FILES['blah']['tmp_name'])

常に true を返します。

しかし、 is_uploaded_file がPHP 4.0.3で最初に登場していたのに対し、 $ _ FILES ここで理にかなっている結論は、 $ _ FILES スーパーグローバルを利用できるようになる前に、アップロードされたファイルの処理を安全に行うことは難しいことです。それ以外のものがあれば、PHP以外のセキュリティ上の問題となっていた register_globals を有効にして、非スーパーグロバルを注入することができます。

今日のコードを書いていて、 $ _ FILES を使用しているとすれば、現在の実装で is_uploaded_file は "役に立たない"と言うでしょう。あなたに "悪い"ファイルを処理させるよう騙すことができます。

しかし、 is_uploaded_file は、ファイルをアップロードしてファイルを利用できるようにしているかどうかにかかわらず、現在も将来も正しく機能することが保証されています。プログラマーはそうです。おそらく今は具体的な内容は何も提供されていないかもしれませんが、保証付きの「安全なファイルアップロード」という概念の抽象です。私は、 $ _ FILES に対してそのような保証はないと思うでしょう(現状の現状が「悪い」の場合には回帰を考慮していますが)。

25
追加された

任意の文字列を is_uploaded_file に渡すことができます。

確かに、 $ _ FILES の何かをまっすぐに渡すと、もちろんそれは常に true を返します。

10
追加された
ポイントまでまっすぐなので+1。ありがとうジョンとトマラク。
追加された 著者 Serge Wautier,
bool is_uploaded_file ( string $filename )

filenameで指定されたファイルがHTTP POST経由でアップロードされた場合はTRUEを返します。これは、悪意のあるユーザーが、スクリプトが動作してはならないファイル(例えば、/ etc/passwd)を処理するようにスクリプトを騙そうとしていないことを保証するのに役立ちます。

この種のチェックは、アップロードされたファイルで行われたことがユーザーに、または同じシステム上の他のユーザーにもコンテンツを明らかにする可能性がある場合に特に重要です。

適切な作業のために、関数is_uploaded_file()は以下のような引数を必要とします。

 $_FILES['userfile']['tmp_name'],

- クライアントのマシン上にアップロードされたファイルの名前

$_FILES['userfile']['name'] 

動作しません。

ソース:PHPマニュアル

1
追加された
PHP - 日本のコミュニティ [ja]
PHP - 日本のコミュニティ [ja]
4 参加者の

このグループではPHPについて話します。 パートナー:kotaeta.com