そして、実際に画像を提供することが、サーバーを危険にさらす可能性のある不正なPHPファイルのリスクの大部分であることが明らかになりました。
これは、次の2つの条件が満たされた場合にのみ発生します。
- 画像以外のファイルのアップロードを許可する
- ダウンロードは直接リンクを介して行われます
これらの1つを阻止すると、危険がなくなります。もちろん、両方を閉じる方が良いです。
データベースソリューションは、条件#2を中断することを目的としていますが、画像をアップロードするときに、関数を使用して実際に画像であることを確認することもできgetImageSize()
ます。imageCreateFromJPEG()
または、または他の適切な機能を使用して画像を読み込もうとしています。
ロードされたオブジェクトが画像でない場合は、「申し訳ありませんが、画像が壊れています」と表示してください。これにより、壊れた画像をアップロードすることからユーザーを保護し、不正なPHPファイル(または著作権で保護されたビデオやクラックされた実行可能ファイルなど)を誰かがアップロードすることからユーザーを保護します。
更新:既存のアップロードおよびダウンロード機能を難読化することもできます。
現在、ユーザーイメージをアップロードし、それに一意のIDを割り当て、それをとして保存し、 URLとして./images/UNIQUEID.jpg
ユーザーに提供するとします。http://www.yoursite.com/images/UNIQUEID.jpg
.htaccess
アクセス./images/whatever
がにリダイレクトされるようにを適用します./images/index.php?ID=whatever
index.php
「何でも」を取り、画像IDを抽出し、画像を出力するスクリプトを作成します。
すべての古いURLは引き続き機能し、画像を直接ロードしているように見えますが、実際に行っているのは、画像をチェックし、解釈せずにバイトストリームとして送信するPHPスクリプトを呼び出すことです。
ETag
ID、画像ファイルの、およびファイルサイズに設定するLast-Modified
必要file_mtime()
がContent-Length
あります。また、着信ヘッダーを確認することもできIf-Modified-Since
ますIf-None-Match
。ファイルの日付がIMSに対応するか、IFN値がIDに対応する場合HTTP/304 Not Modified
は、画像の代わりに回答を送信して、帯域幅を大幅に節約できます。