2016-11-28 15 views
0

このマニュアルでは、セキュリティ上の理由から何かが表示されていますが、何が問題なのかよく分かりませんでした。PHP - なぜmove_uploaded_fileを使用し、名前を変更しないのですか?

この関数は、filenameで指定されたファイルが(それはPHPのHTTP POST アップロード機構を介してアップロードされたことを意味する)有効なアップロードファイル であるかどうかを確認します。ファイルが有効な場合は、宛先によって指定された ファイル名に移動されます。

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

PHPでアップロードされていることを確認しますが、確認しないとどうなりますか?どんな情報が明らかになったのか、そしてどのように?

誰かがこれを説明できますか?例は素晴らしいでしょう。

+0

ファイルの内容自体とファイル名は明らかです。 httpを介して公開されている '/ img'フォルダへのアップロードを許可するPHPを想像してみてください。イメージは、それをさらに処理し、保護し、その内容と名前を検証し、名前を変更します。 – arkascha

+0

@arkaschaしかし、それは私の質問ではありません。必要なものすべてを検証して、 'move_uploaded_file'ではなく' rename'を使うことができます。 – HtmHell

+0

しかし、名前を変更するだけの場合、ファイルはすでに同じ物理的な場所にあります。すべての潜在的なセキュリティの影響を伴います。注:それは必ずしも安全ではない。しかし、恐らく一部の人々は安全でない設定を実装するでしょう。そういうわけで、別の解決方法が選ばれました。そして、btw、それはなぜ重要なのでしょうか? – arkascha

答えて

0

この場合のセキュリティ上の問題は、アップロードディレクトリが一般公開されていることです。

このような状況を回避するには、ApacheなどのWebサーバーを設定して、ディレクトリの公開を禁止する必要があります。

また、PHPスクリプトでファイルをアップロードするときは、ファイルの名前を混合文字で改名してください。

たとえば、暗号化されたタイムスタンプと実際のファイル名を組み合わせて使用​​できます。

ファイルのアップロードを処理するのが一般的なようです。この方法でファイルのアップロードを安全に処理できます。

EDITED:

この答えは、コメントでは、あなたの質問ごとに編集されています。

名前を変更するには、wwwディレクトリ内の既存のファイルをrename($existing_old_file_name, $new_file_name)の機能で使用する必要があります。

move_uploaded_file($tmp_uploaded_file_name, $new_file_name)機能は、アップロードされたファイルをtmpディレクトリから指定した宛先に、関数の第2パラメータとして移動します。

+0

しかし、あなたは 'move_uploaded_file'を使うときにもこれらの問題を抱えています。私の質問はなぜ 'move_uploaded_file'ではなく' rename'ですか? – HtmHell

+0

'rename()'関数で名前を変更するには、wwwディレクトリ内に既存のファイルが必要です。 'move_uploaded_file()'関数は、アップロードされたファイルをtmpディレクトリから、関数内の2番目のパラメータとして指定した送り先に移動します。 – Perumal

+0

いいえ、 'rename'を使うと、tempディレクトリから目的のフォルダにファイルを移動することもできます:' rename($ tmp_uploaded_file_name、$ new_file_name) ' – HtmHell

0

PHPスクリプトでは、実行時に名前が決まったファイル(アップロードされたばかりの一時ファイルの名前)が移動する可能性が高くなります。チェックは、記述の悪いスクリプトがシステムファイルや認証秘密​​を含むファイルを公開しないようにするためのものです。

イメージをサーバーにアップロードし、私が提供している超かわいい猫のGIFを埋め込んでそのイメージを拡張し、再度ダウンロードできるスクリプトを作成するとします。

http://example.com/add-kitty.php?img=ato3508.png&add=kitty31.gif 

それとも私が間違って、このことを考えて、クッキーやPOSTデータで同じ情報を埋め込む:あなたが作業している画像を追跡するために、私は私の編集ボタンの要求URLでファイル名を埋め込みますより安全になります。次に、適度に進取しているスクリプト児童が来て、これを(またはPOST /クッキー同等物)しようとします:

http://example.com/add-kitty.php?img=$2Fetc%2Fpasswd&add=kitty31.gif 

それを見ますか?それはURL /etc/passwdのURLです。おっとっと!あなたはちょうどあなたの/etc/passwdファイルをダウンロードできるようにしているかもしれません。

明らかに、これは完全な悪用ではありませんが、私はあなたが考えていると確信しています。move_uploaded_file関数は、あなたのコードに意図しないファイル名を挿入する攻撃からあなたを守るために特別なチェックを行います。

+0

私が正しく理解していれば、アップロード中は何も保護されませんが、最初にアップロードしないで画像を表示するとセキュリティホールを防ぐのに役立ちますか? (そして悪いコーディングをした場合にのみ)また、それが悪いファイル名であることをどうやって知っていますか?それにurlencodedスラッシュがある場合は? – HtmHell

+0

いいえ、あまりありません。ユーザーが画像をアップロードした後も、サーバーに編集方法を伝える要求を引き続き送信し、それを送り返します。これらの後のリクエストは、実際にアップロードしていないものをあなたに送信するようにサーバーを騙すように微調整することができます。あなたは(@ HtmHell)正しいですが、正しく書かれたコードはこの機能を必要とせずに安全に動作することができますが、それでも利益を得ることができる**多くの**コードが残ります。 – alexis

関連する問題