• ベストアンサー

認証機能を使用して画像を見せないようにしたい

認証機能を使用して画像を見せないようにしたいのですが、どうしたらいいでしょうか。 現在、PHP+MySQLでプログラムを組んでいますが、写真画像は、別フォルダ内に保管し、MySQLでファイル名の検索するようにしています。 SESSION機能を利用し、各PHPの認証機能を作ることができました。しかしながら、各PHPページ内にある画像表示のプロパティを開いて、そのURLをコピーし、ログアウト後、再度プロパティでコピーしたURLをたたくと、表示されてしまいます。 画像にもSESSION機能をつけることはできないのでしょうか。 また、同等のものでもOKです。 一時、HTTP認証も考えましたが、ID/PASSの発行数が多いので 断念しました。 ご教授願います。

質問者が選んだベストアンサー

  • ベストアンサー
  • nick9090
  • ベストアンサー率26% (102/378)
回答No.2

No.1さんも回答している通り、画像を吐き出す専用のスクリプトを用意します。 それを仮にimage.phpとします。 あと、mod_rewriteを使います。詳しい使い方は検索してください。 たとえば、http://example.com/image/hoge.jpg という画像へのアクセスを制御するには、以下のようにします。 まず、mod_rewriteにより、誰かが http://example.com/image/hoge.jpg にアクセスすると、たとえば image/hoge.jpg がPATH_INFOとしてimage.phpに渡ってリダイレクトされるように設定する。 あとは、それを受け取ったimage.phpが、アクセス者が閲覧権限を持っているかどうかをSESSION変数で確認し、OKなら画像(hoge.jpg)を吐き出す、NGならエラーメッセージを出す。 なお、この場合はHTTPヘッダも自前で吐き出す必要がありますので、その辺の勉強も必要になってきます。勉強と言っても、ちょっと検索すればすぐに見つかりますが。 それとこの手の処理をする場合は「ディレクトリ・トラバーサル」など、ファイルシステム関連への攻撃を防ぐ措置も十分考慮に入れておいてください。

php2864
質問者

お礼

ありがとうございました。1か月やってみましたが、難しく手をこまねいています。1か月も返答しないですみませんでした。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

image.php的なものを用意し、 image.php?id=1234のようにidを渡してmysqlから所在URLを受け取り PHPの処理でセッションを確保しつつ、headerをつけて画像を吐き出して やればよいでしょう。 どうしてもめんどうならBasic認証ですね。それならフォルダ単位での認証なので ダイレクトなアクセスをはじけます。 (もちろん厳密な認証という意味ではあまいですが・・・)

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • Basic認証

    初めまして、karuwazaといいます。 PHPとDB(Postgres)の勉強を始め、現在Basic認証の勉強をしています。 以下が自分が記載したコードなのですが、なぜ上手くいかないのか? 自分では解りません。 どこがどう間違っているのかなどのご指摘が頂ければと思い投稿させて 頂きました。 ご教授宜しくお願いします。 <?php include("./tools/common.php"); $con=db_connect(); //スーパーグローバル変数対策 if(!isset($PHP_AUTH_USER)){ $PHP_AUTH_USER = $_SERVER['PHP_AUTH_USER']; } if(!isset($PHP_AUTH_PW)){ $PHP_AUTH_PW = $_SERVER['PHP_AUTH_PW']; } if(!isset($PHP_AUTH_USER)){ header("WWW-Authenticate: Basic realm=\"WebSystem\""); header("HTTP/1.0 401 Unauthorized"); exit; }else{ $sql="SELECT id, pass FROM テーブル名 ORDER BY id"; $res=pg_query($con, $sql); $num=pg_num_rows($res); for($i=0; $i<$num; $i++){ $name=pg_fetch_row($res, $i, 's_name'); $pass=pg_fetch_row($res, $i, 'pass'); if($name==$PHP_AUTH_USER && $pass==$PHP_AUTH_PW){ session_start(); $_SESSION['s_name'] = $name; $url = // 指定URLへジャ~ンプ header('Location: '. $url); // HTTPヘッダを送信する }else{ header("WWW-Authenticate: Basic realm=\"WebSystem\""); header("HTTP/1.0 401 Unauthorized"); echo "<CENTER><FONT COLOR='red'>ユーザー認証が必要です。</FONT>\n"; exit; } } } db_close($con); ?>

    • 締切済み
    • PHP
  • 画像認証キャプチャ(PEAR Text_Captcha)の戻るボタン使用時の画像更新について

    PHPで画像認証キャプチャにPEARのText_Captcha::factoryを使っていますが(Mysql上に画像認証の合言葉が保管される)、入力フォームでSUBMITボタンを押した後、入力した画像認証が間違っていて、ブラウザーの戻るボタンなどで戻った際、Mysql上の合言葉は変更されているのですが、入力フォーム上の画像認証の画像はそのままです。 ですからその状態で画像認証の画像通り文字を入力してもまたエラーになります。 ブラウザーの戻るボタンで戻った際にも画像認証の画像が自動で更新されるようにできないものでしょうか? 宜しくお願いします。

    • ベストアンサー
    • PHP
  • HTTP認証ダイアログについて

    下記のPHPスクリプトを実行して、アカウント(ID:admin,パス:pass)を入力してもHTTP認証ダイアログが消えません。ダイアログが消えて、Hello! と表示させたいのですが、どこが間違っているのか、教えていただきたいです。 <?php $user="admin"; $pass="pass"; if (!isset($_SERVER['PHP_AUTH_USER'])) { //初回認証時(PHP_AUTH_USER:HTTP 認証しているときにそのユーザー名がセットされます。ダイアログに入力した値) header("WWW-Authenticate: Basic realm=\"PHP Web Storage\""); header("HTTP/1.0 401 Unauthorized"); echo "Please input account info!\n"; exit; }else { $flg=false; while(isset($user)){ if($_SERVER['PHP_AUTH_USER']==$user && $_SERVER['PHP_AUTH_PW']==$pass){ $flg=true; break; } } if(!$flg){echo"Please input valid account!\n";exit;} //停止 else{echo'Hello!';exit;} } ?>

    • ベストアンサー
    • PHP
  • ベーシック認証と、サイト内入力

    ベーシック認証と、サイト内入力についてご教授頂けると幸いです。 一般には、見せたくないページをhtaccessを使ってベーシック認証にしています。 当然、IDとPASSを訪ねる画面が表示されます。 でも、多くのサイトは、サイト内にIDとPASSを入力させログインのボタンでログインみたいになっていると思います。 MySQLなどを使えば出来そうですが、そういうものを使用せず、 PHPやJSなどで処理が出来ないものかと悩んでいます。 どうぞ、よろしくお願い致します。

  • SESSION機能を使ったログイン認証

    SESSION機能を使ってログイン認証をPHPで作りたいのですが・・・ いろいろなサイトを回ってみてもPEARを使ったものやBASIC認証のものばかりでどうも・・・うまくいかないのです。 何かやり方もしくはいいサイトご存知でしょうか? ・dbにあるパスワードとメールアドレスを入力したパスワードとメールアドレスに照合したもの ・パスワードとメールアドレスに合った会員の方の名前を「ようこそ○○さん」と表示したい

    • ベストアンサー
    • PHP
  • ログイン認証で

    ログイン認証で <? session_start(); $con=mysql_connect(localhost,***,***); mysql_select_db("***"); $passwd=addslashes($_POST['passwd']); $email=addslashes($_POST['email']); $name=addslashes($_POST['name']); $sql="select * from users where email='{$_POST['email']}' and passwd='{$_POST['passwd']}'"; $_session['name']=$name; $rs=mysql_query($sql); if(mysql_num_rows($rs)>0){ $_session['login']=1; header('location:'. "top.php"); exit; } mysql_close($con); ?> <html> <head> <title> </title> </head> 認証失敗 <br> <a href="login.php"> 戻る</a> <body> と入力したのですが、 emailとpasswdに合ったnameを違うページに表示したいのに、それができないんです・・・ ようこそ<? $_SESSION['name']?> さん<br> どこかおかしなところありますか?

    • ベストアンサー
    • PHP
  • セッションに関する認証について

    こんにちは。お世話になっております。 これまで多くの有識者よりご指導頂き、セッションを用い、ログイン認証を取り入れたサイトを作成しておりますが、その中で、会員登録してもらった際、登録したアドレス宛てにメールを送信し、メールに記載したURLをクリック(&DB問い合わせ)してもらう事で、実在するアドレスかどうか、を認証する機能を作っています。 メールに記載するURL http://localhost/confirm/index.php?time=$time&mail=$mail 現在テスト段階と言う事もあり、複数のブラウザを開き、各々違うユーザでログインしているときなどがあるのですが、送られてきたURLをクリックすると、ログアウトせずブラウザを閉じたユーザ名でログインしてしまう、といった現象が起こっております。 そこで、その対処法として、そのURLのファイル上に、 session_start(); session_destroy(); session_start(); などと、一旦セッションを削除し、セッションを再スタートさせる事で対処しておりますが、以上のような現象は、「そもそも何処か間違ったコーディングをしているのでは?」といった不安から、今回投函させていただきました。 まとまりの無い文章、かつ抽象的な質問では御座いますが、考えられる要素およびその適切な対処法など、アドバイス頂けたら幸いに思っております。 知識不足からくる不安ですが、宜しくお願い申し上げます。

    • ベストアンサー
    • PHP
  • basic認証について分からなくて困っています。

    htaccessでbasic認証を行っています。ID、passをURLに含めて、ダイヤルボックスを表示させないでログインできる方法はないでしょうか?

  • phpを用いたダイジェスト(digest)認証後のログアウト処理方法

    いつもお世話になっています. 早速ですが,タイトルの件について質問します. 現在作成しているサイトでダイジェスト認証を行いたく,以下のプログラム digest_auth() を利用して認証を行っています. URL: http://techblog.ecstudio.jp/tech-tips/digestauth.html ※説明のため,"[1],[2],[3]"を追記しています. ----------------------------------------------------------------------- function digest_auth($auth_list,$realm="Restricted Area",$failed_text="認証に失敗しました"){ // [1] if (!$_SERVER['PHP_AUTH_DIGEST']){  $headers = getallheaders();  if ($headers['Authorization']){   $_SERVER['PHP_AUTH_DIGEST'] = $headers['Authorization'];  } } // [2] if ($_SERVER['PHP_AUTH_DIGEST']){  // PHP_AUTH_DIGEST 変数を精査する  // データが失われている場合への対応   ※ 文字数制限のため中略. (暗号化のための準備.)  if ($auth_list[$data['username']]){   // 有効なレスポンスを生成する   $A1 = md5($data['username'].':'.$realm.':'.$auth_list[$data['username']]);   $A2 = md5($_SERVER['REQUEST_METHOD'].':'.$data['uri']);   $valid_response = md5($A1.':'.$data['nonce'].':'.$data['nc'].':'.$data['cnonce'].':'.$data['qop'].':'.$A2);      if ($data['response'] != $valid_response){    unset($_SERVER['PHP_AUTH_DIGEST']);   }else{    return $data['username'];   }  } } // [3] //認証データが送信されているか header('WWW-Authenticate: Digest realm="'.$realm.'", nonce="'.uniqid(rand(),true).'", algorithm=MD5, qop="auth"'); header('HTTP/1.1 401 Authorization Required'); header('Content-type: text/html; charset='.CHARSET ); die($failed_text); } ----------------------------------------------------------------------- index.php より 上記関数 digest_auth() を含む degest.php へリンクさせ,ログイン及び認証させています. degest.php では”ログアウト”を index.php へリンクさせ,戻る仕様としています. ここで,一度ログアウトした際に,認証データがクライアント側にあるため,再度 index.php よりログインする際,プログラム中の[1] や [2] により処理され,入力ダイアログ[3]は出てきません. ブラウザを閉じることで,認証データ(セッション?)が消え,ログアウトしたことになるということは見つけましたが,今回は認証データを任意に消したいというものです. ログアウトした際に,クライアント側のセッション情報を消せばよいのかとおもい,ログアウト先の index.php 内で以下の処理を行ってみました. URL: http://www.php.net/manual/ja/function.session-destroy.php ----------------------------------------------------------------------- (文字数制限のため省略) リンク先 "例1" ---------------------------------------------------------------------- しかし,うまくログアウトすることができませんでした.つまり,入力ダイアログ[3]が表示されませんでした. また,$_SERVER['PHP_AUTH_DIGEST']の値がセッション情報から得られいて,セッション情報を消しても,[1]によりヘッダー情報から$_SERVER['PHP_AUTH_DIGEST']の情報を補っているためかとおもい,[1]を消してから再度トライしてみましたが,やはりダメでした. 確認だけで当たり前の現象ですが,[1]を消して,さらにunset($_SERVER['PHP_AUTH_DIGEST'])を最初に行うことで認証情報を消し,再度入力ダイアログが現れる現象を確認しました. (もちろん,正しい値を入力してもまた聞かれる状態です..) 現時点では,なんらかの方法により,クライアント側の認証データ(セッション?)を消すことで,ログアウトができると考えています. 以上より,今回用いているダイジェスト認証処理を行った後のログアウト処理方法についてどなたか御教授ください. よろしくお願いします.

  • HTTPのBASIC認証につきまして。

    こんにちは、kanpoと申します。 PHPマニュアルに以下のような記述があったのですが 下記について質問させてください。 manual start======================================================= Example 2-1. HTTP 認証の例 <?php if(!isset($PHP_AUTH_USER)) { Header("WWW-Authenticate: Basic realm=\"My Realm\""); Header("HTTP/1.0 401 Unauthorized"); echo "ユーザーがキャンセルボタンを押した場合に送られるテキスト\n"; exit; } else { echo "こんにちは $PHP_AUTH_USER.<P>"; echo "あなたは、パスワードとして $PHP_AUTH_PW を入力しました。<P>"; } ?> 単に $PHP_AUTH_USER、$PHP_AUTH_PW を出力するのではなく、 ユーザー名とパスワードの有効性をチェックしたいと思うかもしれません。 その場合、クエリーをデータベースに送るか、ある dbm ファイル中の ユーザーを調べるといったことをすることになるでしょう。 manual end========================================================= この、”クエリーをデータベースに送るか”というところなんですが これはUID&PASSをDBに登録されている情報と照合をかけるという意味だと思うのですが、ポップアップWindowで入力されたUID&PASSを.htaccessにかかれたUID&PASSで認証しそのUID&PASSをDBによりもう一度照合するということでしょうか? それとも、ポップアップで入力してもらったUID&PASSをそのままDBにて認証できるのでしょうか? よろしくご教授ください。

    • ベストアンサー
    • PHP
このQ&Aのポイント
  • FAX-2840の受信はできるが送信ができないトラブルについて相談します。
  • 最近、FAX-2840での送信ができなくなりました。受信は正常に行えるのですが、送信すると相手先に「話し中」と表示されます。同じ型番のFAXを使っているのに送信できない原因を知りたいです。
  • お使いのFAX-2840では受信はできるが送信ができません。他の繋ぎ方や時報にもかけて試しましたが、いずれも送信できません。解決方法を教えてください。
回答を見る