2

ログインしたユーザーが製品の写真をアップロードできるようにする小さな Web アプリを構築しています。私は正しく構築しようとしていますが、過去にいくつかの単純な実装を行った後、アップロードされたすべてのコンテンツをパブリック フォルダーに追加することにしました。

\app (public folder)
-\index.php
\includes
\config
\uploads

これにより、悪意のあるユーザーが PHP ファイルをアップロードできた場合、そのファイルに到達できず、サーバーから提供されなくなります。

そうは言っても、これらの写真を Web ページに表示するにはどうすればよいでしょうか? これを行う最善の方法は何ですか?過去に、「getImage.php?id=555&c=44j54k3h5」のような ID パラメータ (および、ユーザーが単に ID を推測するのを避けるために生成された値のハッシュ) を取る getImage.php ファイルを使用しました。サーバーは、DB 内の画像情報 (実際のパス) を取得してコンテンツをロードし、ヘッダーを再構築して、画像を送信します。

この方法に関してセキュリティ上の懸念はありますか? 可愛くする方法ってありますか?/images/imagename.jpg を検索して getImage.php ファイルに送信する htaccess 書き換えルールを使用すると、セキュリティ ホールが追加されますか? ベスト プラクティスに関するアドバイスをいただければ幸いです。

4

3 に答える 3

3

このクラスをチェックしてください。それはアップロードを処理し、セキュリティチェックを行い、あなたをコーヒーにします:)

http://www.verot.net/php_class_upload.htm

于 2012-05-31T18:21:31.490 に答える
1

アップロードされた画像を提供する方法のセキュリティは、実際には他の多くの要因に依存しています.

  • アップロード時に画像/ファイルはどのように処理され、保護されますか? アップロードのディレクトリ/ファイルのアクセス許可は何ですか?
  • それらの場所から読み書きできるプロセスは?
  • 任意のファイルを実行する可能性のあるファイル ハンドラーには、どのような種類がありますか?
  • PHP->get_image->display_image ルートを使用している場合、アップロード後に (getimage で) 悪意を防止しようとしますか?

Apache mod_aliasを使用して、webroot の上のディレクトリを参照します。このようにして、ルート上のディレクトリ全体を公開することなく、画像へのリンクを引き続き利用できます。

于 2012-05-31T18:25:50.110 に答える
1

「きれいな」方法は、.htaccessリダイレクトを使用することです

RewriteEngine On                                                                                                                                                                                                                                  
RewriteBase /                                                                                                                      
RewriteRule ^getImage/([0-9]+)/(.+)\.png$ getImage.php?id=$1&c=$2 [NC,L]

次にgetImage.php

if (isset($_GET['id']) && isset($_GET['c'])) {

    // set headers
    header("Content-Type: image/png");

    // cache control
    header("Cache-Control: private, max-age=10800, pre-check=10800");
    header("Pragma: private");
    header("Expires: " . date(DATE_RFC822, strtotime("2 day")));
    if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE'])) {
            header('Last-Modified: ' . $_SERVER['HTTP_IF_MODIFIED_SINCE'], true, 304);                                    
            exit;                            
    }

    /* do things */
    imagepng($image_resource);
    imagedestroy($image_resource);
}
else {

    echo "bad request";
}

だから代わりに

site.com/getImage.php?id=555&c=44j54k3h5

あなたが使うだろう

site.com/getImage/555/44j54k3h5.png

この方法では、追加のセキュリティ リスクや抜け穴はありません。インジェクション攻撃を避けるために、クエリを実行する前に get 変数がエスケープされていることを確認してください。

悪意のあるファイルのアップロードから身を守りたい場合は、サービスを提供する前にそれを行う必要があります。

于 2012-05-31T18:37:40.550 に答える