原因:
あるプロジェクトで、すべての顧客がファイルをアップロードできず、すべて失敗が返されたというフィードバックをユーザーから受け取りました。調査の結果、PHP の is_uploaded_file 関数が問題を引き起こしていることが判明しました。
詳細な分析:
通常の状況では、PHP を介してファイルをアップロードする場合、is_uploaded_file 関数を使用して、ファイルが HTTP POST を介してアップロードされるかどうかを判断する必要があります。これを使用すると、悪意のあるユーザーがスクリプトを騙すことができなくなります。 /etc/passwd などのアクセスできないファイルにアクセスします。
今回発生した問題は、C:/WINDOWS/Temp/php99.tmp であるはずの tmp_name が C://WINDOWS //Temp//php99.tmp になり、is_uploaded_file 関数が間違った情報を返すことです。
処理方法:
以下のコードを追加すると問題は解決します。
$file['tmp_name'] = str_replace('////', '//', $file['tmp_name']);
実際の文字列 "////" は 2 つの / であることに注意してください。他の 2 つは脱出を表すために使用されます。
詳細な調査:
なぜ特定の環境でこれが起こるのでしょうか? 次の分析を見てみましょう:
magic_quotes_gpc = On PHP の場合。構成では、magic_quotes_gpc がオンになっており、magic_quotes_gpc パラメータがオンになっている PHP 環境では、addlashes 効果が GET/POST /Cookie に自動的に追加されます。 addslashes は $_FILES に追加されないことに注意してください。
magic_quotes_gpc が Off の場合、addslashes 関数が $_FILES 配列に追加されるため、問題が発生します。この問題は、magic_quotes_gpc がオフになっている PHP 環境でも発生します。
ところで、SVN の MooPHP コードはこの問題を修正しました。
is_uploaded_file 関数の分析:
ファイルが HTTP POST 経由でアップロードされているかどうかを判断します
bool is_uploaded_file ( string $filename )
filename で指定されたファイルが HTTP POST 経由でアップロードされた場合は TRUE を返します。これを使用すると、悪意のあるユーザーがスクリプトをだまして、/etc/passwd などの本来アクセスできないファイルにアクセスできないようにすることができます。 このチェックは、アップロードされたファイルによってそのコンテンツがシステムのユーザーまたは他のユーザーに表示される可能性がある場合に特に重要です。
is_uploaded_file() 関数が正しく動作するには、$_FILES['userfile']['tmp_name'] のような変数を指定する必要があり、クライアントからアップロードされたファイル名には $_FILES['userfile'] が指定されている必要があります。 ['名前'] が正しく機能していません。
http://www.bkjia.com/PHPjc/824960.html