1

私は現在、CodeIgniter を使用して画像アップロード Web サイトを開発しようとしています。問題は、今日問題に遭遇したことです。それを解決するために、どんな種類の助けも本当に感謝しています.

基本的に、サイトは機能しています。しかし問題は、ファイルが非公開ではないということです。ユーザーは、ユーザーがアップロードしたファイルが自分だけに表示され、たくさんの URL を推測するだけの人には表示されないようにしたい場合があります。(例: user1 は非公開にしたい image1 をアップロードします。=>[localhostlocalhost/upload_script/files/image1.jpg]、user2 は URL [localhost/upload_script/files/image1.jpg] を推測して入力することで image1 にアクセスできます。これは私たちが起こしたくないことです。) 私はいくつかの調査を行いましたが、これにはおそらくファイルを提供するための別のコントローラーが必要になると思います (セッションデータをチェックします)。私はかなり前から PHP でセッションなどを「遊んで」いましたが、CodeIgniter ではあまり詳しくありません。これが唯一の方法ですか?私はしません ユーザーごとに個別のディレクトリを作成する必要があると思いませんか? 正しい方向に向かう方法や例を教えてください。

前もって感謝します、

ハリス21

4

3 に答える 3

3

ファイルを保護するには、ファイルを Web ルートの外に保管する必要があります。そうしないと、人々は常にURL ハッキングを行うことができます。

私は非常に便利なapache 用のmod_xsendfileを使用しました(サーバーへのそのようなアクセス権がある場合)。これにより、アクセス制御によって保護され、適切な資格情報なしではアクセスできないファイルを提供できます。

画像を表示するために CI コントローラーに入れることができるコード スニペット (mod_xsendfile ページから適応):

...
if ($user->isLoggedIn())
{
    header("X-Sendfile: $path_to_somefile");
    header('Content-Type: image/jpeg');
    exit;
}

mod_xsendfile をインストールできない場合、他の唯一のオプションはreadfile()、TheShiftExchange が言うように使用することです。

于 2012-07-29T15:57:39.903 に答える
2

PHP を使用して画像を返し、ウェブサーバーのルートの背後にある画像ディレクトリをロックします。このようにして、画像を提供する前に、セッション変数を介してユーザー資格情報を確認し、ユーザーが画像を表示できることを確認できます。それ以外の場合は、ユーザーを Web サイトに直接リダイレクトして、アクセス権がないことを警告することができます。このような画像の提供は、Web サーバー (apache、nginx など) を介して提供するよりもはるかに遅くなりますが、画像のダウンロードを制御できるようになります。

より正確には、画像の詳細をデータベースに保存します。たとえば、id、file_path、title、uid などの列があります。ユーザーがhttp://domain.com/files/download/3を呼び出してイメージをダウンロードするたびに、現在ログインしているユーザーが ID 3 のイメージをダウンロードできるかどうかを確認できます。それを行う独自のコントローラーを作成する必要があります。

ここで同様のことを行っていますhttp://www.mediabox.si/画像がどのように提供されるかを確認できます。サムネイル画像を許可し、通常の訪問者に表示される大きな画像に透かしを入れています。

于 2012-07-29T11:10:49.020 に答える
1

唯一の方法は、public_htmlの外部に画像を保存することです。それ以外の場合は、定義上、直接アクセスするためにファイルを開いています。

コントローラーを使用して、ユーザーがファイルへのアクセスを許可されているかどうかを確認し、php関数readfile()を使用してファイルを提供します

ここで私の他の質問の1つでいくつかのコードを読むことができます:このPHP関数はファイルの横断から保護しますか?

そして、これは実際には非常に高速です-パフォーマンスの低下にまったく気付かないでしょう

于 2012-07-29T14:50:43.627 に答える