サーバーへのファイルのアップロードの問題は骨に吸い込まれているように見えますが、最近の出来事の1つがこれを疑っています。
しばらく前に、セキュリティを強化するために、サーバーでPHP
open_basedir設定が有効になりました。 その後、多くのPHPアプリケーションがサーバーへのファイルのアップロードを停止しました。
リンクには多くの手紙がありますが(まだ読むことをお勧めします)、ここに簡単に書きます:
- open_basedir は 、PHPが指定されたディレクトリツリーにアクセスできるファイルのリストを制限します 。
- open_basedirは、 保護モードが使用されているかどうかに関係なく使用できます。
サーバーでこの設定を有効にした後、スクリプトはサイト(仮想ホスト)のディレクトリ内で「ロック」されました。 ファイルは一時ファイル用のディレクトリに引き続きロードされました。このファイルは別のセクションにあり、サイトディレクトリツリーには含まれていませんでした。 したがって、
$ _FILES変数の
tmp_name要素を使用してダウンロードしたファイルにアクセスしようとしたすべてのスクリプトは失敗しました。
もちろん、
愚かな人々がPHP言語を開発している
わけではないので、open_basedirアクション
はis_uploaded_fileおよびmove_uploaded_file関数に
は適用されません。実際、これらはダウンロードされたファイルで動作するように設計されています。
では、問題は何ですか? しかし、問題はこれです:多く(
実際に多く! )
標準機能をバイパスして 、ダウンロードしたファイルに直接アクセスします。
これは通常、ダウンロードしたファイルがサイトに保存されることを意図していない場合に行われます。 原則として、これは価格リスト(csv、xls)、サイトファイルツリーに保存される前に変換された写真のインポートです。 多くの場合、$ _FILESは、move_uploded_fileを呼び出す前に、ロードされたイメージ(getimagesize)を確認するために使用されます。
PHPプログラマー(特に初心者)には、最初に、標準関数の使用を怠らないように強くお勧めします。 関数が書かれている場合、それは何かのために必要です。 第二に、PHP設定とその動作モードを徹底的に研究すること。 これは、そのような間違いを避けるのに役立ちます。
PS誰かが「スクリプトが機能しなくなるようにサーバーを設定します」と言うかもしれません。 ただし、設定がある場合、誰かが間違いなくそれを使用すると信じています。 そして、この後プログラムが機能しなくなると、石が飛び込んできます。 必要ですか?