2011-08-05 6 views
-1

今、私は自分のウェブサイト上の画像にアクセスできるユーザーを制御するためにbase64を使用しています。私はwebrootディレクトリの外にこれらのイメージを保存するので、誰もそれらに直接アクセスできません。次に、postgresqlデータベースにアクセスできるレコードによって、誰がこれらのイメージにアクセスできるかを判断します。基本的に、レコード "a"を照会できる場合、それらはピクチャー "a"を見ることができます。画像を保護する - php base64 vs readfile

if (file_exists($pic)) { 
    $imgbinary = fread(fopen($pic, "r"), filesize($pic)); 
    $picbase64 = "data:image/gif;base64," . base64_encode($imgbinary); 
    echo('<img src="' . $picbase64 . '" />'); 

私のセキュリティを維持しながら、base64ではなくreadfileを使用するにはどうすればよいですか?たとえば、readfileメソッドを使用してイメージをクライアントブラウザに配信する場合、$_GETメソッドを使用して、クライアントブラウザ上にイメージを表示するreadfileおよびヘッダータイプを持つPHPスクリプトに変数を送信する必要があります。問題は誰でもhtmlソースを見て<img src=phpscript.php?imagename=foo.jpg />を見て、ブラウザでhttp://www.hostname/phpscript.php?imagename=bar.jpgのような引数でスクリプトを呼び出すことができるということです。 base64メソッドでは、画像を処理する別のスクリプトを$_GET引数に取る必要はなく、代わりに画像がHTMLページに直接埋め込まれているので、私は現在これを使用しています。

ありがとうございました!

-Edit- ご迷惑をおかけして申し訳ございませんが、匿名アクセスが許可されており、一部の情報は一般公開されています。意味は、あなたが認証されておらず、レコード "a"を読むことができる場合、画像 "a"も見ることができます。

+1

別の画像リクエストにユーザーのCookieが含まれていませんか?ユーザーがログインしていて、 'phpscript.php'でアクセスできたかどうかを確認できます。 –

答えて

2

あなたが今やっていることとあなたがしなければならないことの間の実質的な違いは、複数の要求でファイルを送信することです。これは、要求の間のユーザの認証または記憶を必要とする。

何あなたが今持っていることは次のとおりです。

if (file_exists($pic)) { 
    // do stuff 
} 

そして、何が必要です:

if (file_exists($pic) && user_has_image_permission($pic)) { 
    // do stuff 
} 

だから、あなたが解決するために必要な詳細がuser_has_image_permission()機能の背後にあるロジックです。

これを安全にする必要がある場合は、sessionsでこれに近づくことになりますが、cookiesも使用できます。

シンプルさのためにセキュリティを交換しても構わない場合は、「リンクを知っている人」のようなWebサービスでドキュメントやファイルを共有するのによく使用されるような「URLパスフレーズ」を使用できますGoogleドキュメント、AWS、プライベートRSSフィードなど

最後に、HTTP認証に基づいて、PHPの外部にあるソリューションを使用できます。 Apacheでは、これはAccess Controlという形式です。

+0

-Edit- セッションは、引数をPHPスクリプトに渡す代わりに機能します。ありがとう! – spaghettiwestern

+0

-Edit- セッションは、引数をPHPスクリプトに渡す代わりに機能します。しかし、セッション変数を変更してイメージスクリプトに渡して複数の画像を表示しようとすると、動作しません。今のところ私はこれを回避するのではなく、base64を使用する方法を見ています。ありがとう! – spaghettiwestern

+0

@spaghettiwesternコメントは小さすぎてデザインの詳細には入りませんが、セッション内の個々のファイルを保存するのではなく、ユーザーのセッションを確認してそのユーザーのアクセス許可を確認し、あなたが要求されているイメージを表示できるかどうかを確認する*現在:* .Ie:ユーザー要求イメージID 50. image.phpスクリプトで、セッションでユーザーのアクセス許可を確認します。ユーザーの許可は「B」です。 Bさんはイメージ50を見る許可を持っていますか?はいの場合は画像を表示し、そうでない場合は403ヘッダーを送信します。 – cbednarski

0

私は同意します。クッキーによるアクセスを確認することが最も簡単な方法です。スピードアップを目指すなら、X-Sendfileを検索してください。一度認証されると、Webサーバーへのファイル転送をオフロードできます。 Lighttpdに組み込まれていて、apache mod、https://tn123.org/mod_xsendfile/があります。

関連する問題