皆さんこんばんは!私はちょうど PHP に触れるようになり、いくつかの教科書を読んでいるときに、この一節について言及しました:
is_uploaded_file() 関数を使用してアップロードされたファイルを判断すると、悪意のあるユーザーがスクリプトをだまして /etc などのアクセスできないファイルにアクセスすることができなくなります。 /password
私の質問は、is_uploaded_file() を使用して検出しない場合、「悪意のあるユーザー」はどのようにしてスクリプトをだまして、アクセスできないコンテンツにアクセスさせることができるのでしょうか?分かりません...ダニエルがもっと簡単に説明してくれると嬉しいです、ありがとう!
php5.4 以降のバージョンでは、この関数は意味を持ちません
アップロードされたファイルを操作するには、通常、move_uploaded_file 関数を使用します。この関数は、内部で is_uploaded_file も呼び出します
もちろん、あなたが偏見を持っていることを排除することはできません copy 関数を使用する必要があるため、is_uploaded_file があります
明らかに、それが
copy('/etc/password', './ps')
であれば、システムパスワードファイルをコピーできます
もちろん、あなたのコードはそうではありません。 このように書くには、
copy($file_tmp, $target) と書くことができます
$file_tmp の値が /etc/password の場合でも、システム パスワード ファイルをコピーできます
したがって、 $file_tmp is_uploaded_file をチェックするためにこれを行う必要があります
それでは、$file_tmp はプログラム内の変数であると言うでしょうが、どのように値を割り当てることができるでしょうか?
問題は php の自動登録スイッチにあります
register_globals = on の場合
受信データはグローバル変数になります。たとえば、?file_tmp=xxxx には値が xxxx の $file_tmp 変数があり、名前は file になります。アップロード コントロールは $file_tmp も生成します
この時点で、url パラメーターを使用して php をチートできることがわかりました
このため、
php 5.3 のデフォルトは register_globals = off であり、オンにすることはお勧めできません
php 5.4以降のバージョン register_globals 切り替えはキャンセルされました
アップロードされたファイルを操作するには、通常、move_uploaded_file 関数を使用します。この関数は、内部的に is_uploaded_file も呼び出します
もちろん、 copy 関数を使用する必要がある可能性を排除することはできません。それが is_uploaded_file である理由です
copy('/etc/password', './ps')
であれば、システム パスワード ファイルをコピーできます
もちろん、コードはこのようには書かれません。
copy($file_tmp, $target) と書くこともできます
$file_tmp の値が /etc/password の場合でも、システム パスワード ファイルをコピーできます
したがって、 is_uploaded_file を実行する必要がありますこの $file_tmp を確認してください
では、$file_tmp はプログラム内の変数ですが、どのように値を割り当てることができるのでしょうか?
問題は php の自動登録スイッチにあります
register_globals = on の場合
受信データはグローバル変数になります。たとえば、?file_tmp=xxxx には値が xxxx の $file_tmp 変数があり、名前は file になります。アップロード コントロールは $file_tmp も生成します
この時点で、url パラメーターを使用して php をチートできることがわかりました
このため、
php 5.3 のデフォルトは register_globals = off であり、オンにすることはお勧めできません
php 5.4以降のバージョン register_globals 切り替えはキャンセルされました
ありがとう〜今理解しました〜
静かに収集します