2

調査の結果、画像名をデータベースに保存し、実際の画像をファイル ディレクトリに保存することをお勧めすることがわかりました。いくつかの理由のうちの 2 つは、より安全であり、画像の読み込みがはるかに高速であることです。しかし、firebug ツールを使用して画像を取得するたびに、ファイル ディレクトリ内の画像のパスを見つけて、潜在的な侵害につながる可能性があるため、この手順を実行する意味がわかりません。

私はこれを正しく行っていますか、それともイメージの完全なファイル ディレクトリ パスを表示することは想定されていませんか?

画像をデータベースに保存するための PHP

$images = retrieve_images();
    insert_images_into_database($images);

    function retrieve_images()
    {        
        $images = explode(',', $_GET['i']);

        return $images;
    }

    function insert_images_into_database($images)
    {
        if(!$images) //There were no images to return
            return false;        

       $pdo = get_database_connection();

        foreach($images as $image)
        {

            $path = Configuration::getUploadUrlPath('medium', 'target');
            $sql = "INSERT INTO `urlImage` (`image_name`) VALUES ( ? )";

            $prepared = $pdo->prepare($sql);
            $prepared->execute(array($image));
            echo ('<div><img src="'. $path . $image . '" /></div>');
        }
    }
4

3 に答える 3

1

.htaccess を使用して画像を保護できます。

ここを参照してください:

http://michael.theirwinfamily.net/articles/csshtml/protecting-images-using-php-and-htアクセス

于 2012-07-24T02:16:42.120 に答える
1

画像をデータベースに保存することで当初の目的を達成する方法の 1 つは、引き続き PHP スクリプトを介して画像を提供することです。

  1. ユーザーが画像の実際のパスを知ることを防ぎます。
  2. 画像を の外部に保存してDocumentRoot、Web サーバーで提供できないようにすることができます。また、保存する必要があります。

これを実現する方法の 1 つを次に示しますreadfile()

<?php
// image.php

// Translating file_id to image path and filename
$path = getPathFromFileID($_GET['file_id']);
$image = getImageNameFromFileID($_GET['file_id']);

// Actual full path to the image file
// Hopefully outside of DocumentRoot
$file = $path.$image;

if (userHasPermission()) {
    readfile($file);
}
else {
    // Better if you are actually outputting an image instead of echoing text
    // So that the MIME type remains compatible
    echo "You do not have the permission to load the image";
}

exit;

その後、標準の HTML を使用して画像を提供できます。

<img src="image.php?file_id=XXXXX"> 
于 2012-07-24T02:25:38.227 に答える
0

また、画像の URL パスをデータベース (Amazon RDS) に保存し、実際の画像を A​​mazon S3 のクラウド管理ファイル システムに保存するプロジェクトにも取り組んでいます。

そうする決定は、主に価格、スケーラビリティ、および実装の容易さを考慮して行われました。

安価:まず、データベース (Amazon EC2 / RDS) と比較して、ファイル システム (Amazon S3) にデータを保存する方が安価です。

スケーラブル:また、イメージのリポジトリは将来かなり大きくなる可能性があるため、イメージを提供するための十分な容量を確保する必要がある場合もあります。この点で、データベースに比べてファイルシステムをスケールアップする方が簡単です。実際、クラウド ストレージ (Amazon S3 など) を使用している場合、Amazon によって管理されているため、十分な容量がないことを心配する必要さえありません。使用した分だけ支払う必要があります。

実装の容易さ: 実装に関しては、イメージをファイル システムに保存する方がはるかに簡単です。データベースから画像を直接提供する場合は、おそらく追加のロジックを実装して、blob ファイルを html src blob 文字列に変換して画像を提供する必要があります。一見すると、これは実際にはかなりの処理能力を消費し、Web サーバーの速度が低下する可能性があります。

一方、ファイルシステムを使用する場合は、データベースから画像の src 属性までの画像の URL パスを指定するだけで済みます。

セキュリティ:画像のセキュリティに関しては、画像名をタイムスタンプにランダムな文字列を連結したものに変更したので、ファイル名を知らずに画像を閲覧することは非常に困難です。

すなわち。1342772480UexbblEY7Xj3Q4VtZ.png

お役に立てれば!

注意: ここで何か問題を見つけた場合は、私の投稿を編集してください! これは私の意見であり、誰でも編集できます。

于 2012-07-24T02:38:31.937 に答える