web-dev-qa-db-ja.com

バイナリ画像データをhtmlマークアップに入れてから、通常どおりブラウザで画像を表示することは可能ですか?

これは重要なセキュリティ問題であり、これが可能になるはずです。

簡単な例:

コミュニティポータルを実行します。ユーザーが登録され、写真をアップロードします。アプリケーションは、画像の表示が許可されるたびにセキュリティルールを提供します。たとえば、他の誰かがアップロードした写真を表示できるようにするには、ユーザーはシステムの両側の友人である必要があります。

ここに問題があります:誰かがサーバーのイメージディレクトリをクロールする可能性があります。しかし、このような攻撃からユーザーを保護したいのです。

画像のバイナリデータをHTMLマークアップに直接配置できる場合は、画像のユーザーアクセスをユーザーに制限し、Webアプリケーションの実行をグループ化し、Apacheユーザーとグループに画像データを直接渡すことができます。 HTML。

その場合、唯一考えられる弱点は、Webアプリを実行するユーザーのパスワードです。

すでに可能性はありますか?

48
Joern Akkermann

他の回答で説明されているように、ファイルを保護する他の(より良い)方法がありますが、画像をHTMLに埋め込むことは可能です。

使用 <img>このようにタグ付けします:

<img src="data:image/gif;base64,xxxxxxxxxxxxx...">

どこ xxxxx... partは、gif画像データのbase64エンコードです。

84
bmb

画像ディレクトリにセキュリティが必要な場合は、ディレクトリをまったく公開しません。代わりに、私のimg src属性は、ユーザーIDと画像IDをパラメーターとして受け取るページを参照します。

ページは、そのユーザーが実際にその写真を見るためのアクセス権を持っていることを検証します。すべて問題なければ、バイナリを送り返します。それ以外の場合は何も送信しません。

例えば:

<img src="imgaccess.php?userid=1111&imgid=223423" />

また、推測可能なIDは使用しません。代わりに、base 64でエンコードされたGUIDのようなものにこだわる。

12
NotMe

わかりませんが、ここに行きます。画像フォルダにある静的画像を提供する代わりに、選択したサーバー側の技術を使用して、画像を動的にクライアントに送信できないのはなぜですか?サーバー側のコードが混在して、プログラムでアクセスを許可または拒否することができますか?

<img src="/images/getImage.aspx?id=123353 />
3
Eric

写真をドキュメントルートからプライベートディレクトリに移動し、そのディレクトリにアクセスできるアプリケーションを介して配信できます。アプリが画像タグを生成するたびに、特定の画像にアクセスするときに指定する必要がある短命のセキュリティトークンも生成します。

<img src="/app/getImage.xyz?image=12345&token=12a342e32b321" />

誰かが適切なタイミングで適切なトークンを適切なイメージでブルートフォースする可能性は非常にまれです。少なくとも「getImage」のトークンを検証する可能性があります。

  1. アプリ内のすべての画像タグを追跡し、ランダムに生成されたトークンと画像IDを要求ユーザーにリンクするデータベースにレコードを保存します。 「getImage」アクションは、指定されたパラメーターをそのデータベースに対してチェックします。
  2. ユーザーID、イメージID、およびおそらく現在の日付でチェックサム(MD5、CRCなど)としてトークンを生成し、推測できないソルトを混ぜてください。 「getImage」アクションは、ユーザーのアクセスを確認するために、チェックサムを再計算し、指定されたものと照合します。この方法では、最初の方法よりもオーバーヘッドが少なくなります。

PHPの例:

$token = md5($_SESSION['user_id'].' '.$imageID.' '.$SECRET_SALT.' '.date('z'));
1
the-banana-king

HTML5では、canvasタグとJavaScriptを使用してこれを行うことができます。

おそらく、CSSまたはテーブルレイアウトのいずれかを使用して画像を描画できます(おそらく、パフォーマンス、解像度、移植性が非常に悪い)。

いずれにせよ、人々があなたの写真を撮るのを止めることはできません。彼らはスクリーンショットを撮って切り取ることができました。

クリスが答えで述べたように、各画像のURLを推測したりブルートフォースするのが簡単ではないように、長い画像IDを持っていることが重要です。また、ウェブサーバーディレクトリのディレクトリリストもありません。

0