2

私は画像を安全にアップロードすることを研究してきましたが、実際に画像を提供することが、サーバーを危険にさらす可能性のある不正なPHPファイルのリスクの大部分であることが明らかになりました。

多くの人が、データベース575748を検索して実際にmyphoto.jpgを返すgetimage.php?i = 575748などの画像処理スクリプト(ユーザーが元の画像の場所を知らなくても)を使用する方がはるかに安全であると示唆しています。

スクリプトにどのようなことを実装する必要があるかについて、正しい方向に向けることができますか?コンテンツタイプヘッダーの設定は必須ですが、これでコードの実行を停止できますか?

ありがとう!

4

4 に答える 4

0

アップロードフォルダをルートフォルダの外(つまり、/www/または/htdocs/または/httpdocs/フォルダの外)に配置します。ローカルユーザーのみが書き込みできるように、フォルダーにアクセス許可を設定します。

データベースのアイデアに関しては、間違いなく先に進んで、上記のアイデアと組み合わせてそれを行うことができ、かなり安全な画像アップローダーサービスを作成する必要があります。

関係する唯一のリスクは、アップロード先のフォルダーに適切なアクセス許可を設定しない場合です。これにより、サーバーが危険にさらされる可能性があります。

于 2012-09-17T17:29:45.643 に答える
0

ああ、なるほど。画像をファイルシステムのあちこちに浮かせたくない場合は、画像をデータベースに保存することもできます。どちらの方法でも。スクリプトでApacheの代わりに画像を提供する場合の問題は、画像をメモリにロードする必要があることです。したがって、パフォーマンスへの影響に備えてください。

于 2012-09-17T17:30:34.490 に答える
0

そして、実際に画像を提供することが、サーバーを危険にさらす可能性のある不正な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スクリプトを呼び出すことです。

ETagID、画像ファイルの、およびファイルサイズに設定するLast-Modified必要file_mtime()Content-Lengthあります。また、着信ヘッダーを確認することもできIf-Modified-SinceますIf-None-Match。ファイルの日付がIMSに対応するか、IFN値がIDに対応する場合HTTP/304 Not Modifiedは、画像の代わりに回答を送信して、帯域幅を大幅に節約できます。

于 2012-09-17T17:37:16.637 に答える
0

元のセキュリティ上の懸念に対処するには、保存する前に画像に対してgetimagesize()を実行します。その関数を終了した場合は、画像を破棄falseします。(悪い「画像」が通り抜けるのを防ぐためのより良い解決策を誰かが知っているなら、私はすべての耳です!)

Webアクセス可能なディレクトリの外部のファイルシステムに画像を保存します。キーのテーブルを物理的な場所に使用することをお勧めします。値を格納IMAGETYPE_XXXし(によって返される配列の2番目のインデックスですgetimagesize())、それをオンにして、 imagejpeg()imagepng()などを使用して画像を提供します。実行するときは、Content-typeヘッダーを設定することを忘れないでください。 。

于 2012-09-17T17:39:26.270 に答える