プロが教える店舗&オフィスのセキュリティ対策術

php内で、標記を切り分けて、
imgタグなら?指定に従った画像を、aタグなら?指定に従ってHtmlを出したいのです。
(imgタグの方が主機能です。Htmlにはリンクを入れる必要があるので、
 imgに統一できません)
常に  header('Content-Type: image/gif');
でよいように思えますが、?以降を間違えられた時、
クリックすると、メチャメチャな画面が出てしまいます。

$_SERVERを、Googleって見ましたが、わかりません。
ご教授お願いします。

尚、切り分けた後は、($callで判定できるとすると)
if ($call == "img"){
 header('Content-Type: image/gif');
   :
  (Img作成の処理)
   :
}else if ($call == "a" || GETやPOST){
 header("Content-Type: text/html; charset=SJIS");
   :
  (Html作成の処理)
   :
とするつもりです。

そもそも、何をしたいかというと、
?以降にLaTeXの数式を書けば、(mimeTexを呼んで)イメージを返したい
のです。
だいたいは、出来ています。
http://blogs.yahoo.co.jp/kafukanoochan/62474900. …

A 回答 (3件)

・ブラウザからのリクエストとしては、A からのアクセスなのか IMG からのアクセスなのかを直接的に 区別するような情報はありません。


・ただし、Accept: リクエストヘッダ($_SERVER['HTTP_ACCEPT']) に、そのリクエストでブラウザが受け取り可能なデータ形式の情報が入っています。
(Accept にどういう情報を載せるかはブラウザ次第です)


というわけで、HTTP_ACCEPT が、「IMG 経由の場合は画像形式のみを指定されている」のであれば、どちらからあのアクセスか判断できることになります。

面白そうなのでちょっと調べてみました。いくつかのブラウザについて具体的に調べてみたところ、なかなか簡単には判断できなさそうです。

・Firefox3.5
IMG の場合: image/png,image/*;q=0.8,*/*;q=0.5
A の場合: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
アドレスバー直打ち: Aの場合と同じ

・IE8
IMGの場合: */*
Aの場合: image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/vnd.ms-excel, application/msword, application/vnd.ms-powerpoint, application/pdf, application/xaml+xml, application/vnd.ms-xpsdocument, application/x-ms-xbap, application/x-ms-application, application/x-silverlight, application/x-shockwave-flash, */*
アドレスバー直打ち: Aの場合と同じ

・Opera 10
IMGの場合: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1
Aの場合 : text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1
アドレスバー直打ち: Aの場合と同じ

といった感じになりました。
ブラウザが送り出すリクエスト情報については、このAccept:以外はまったく同じでしたので、Accept以外の情報で判断することは不可能です。

お望みの機能を実現するとしたら、上述のようなAccept:ヘッダ情報の違いで判別するしかありません。
上述のように、ブラウザ毎に動作が違いますから、汎用的な判断は無理そうです。
どうしても実現したかったら、User-Agent: リクエストヘッダ($_SERVER['HTTP_USER_AGENT'])によるブラウザチェックを併用して、

・Firefox3.5の場合→HTTP_ACCEPT にtext/ が含まれるなら A 経由と判定
・IE8の場合→HTTP_ACCEPT に application/ が含まれるなら A 経由と判定
・Opera 10 の場合→判断不可能

といった感じでしょうか。

このやり方で実現するなら、私が今回調べた Fx3.5・IE8以外にも、使われる可能性のあるブラウザについては、どうなっているのか実際に調べる必要があるかと思います。
また、User-Agent は詐称可能ですから、使っているブラウザの誤判定による誤動作の可能性は捨て切れません。

また、アドレスバーに直接URLを入れた場合は、A経由相当になりますので、
画像として表示することはできなくなります。
    • good
    • 0
この回答へのお礼

ご調査頂きありがとうございます。

>使われる可能性のあるブラウザ
Safari=Chrome 
とかありますし、動画取得用の特殊ブラウザもあります。
また、今後増えるかも知れません。
それで、
・Firefox3.5
・IE8
・IE7 (自分で調べてみます)
限定で行きます。他の場合は「出来るだけ救う」仕様で、、、
(詐称されての誤動作は、相手の期待通りか、変なブラウザなので、誤動作でOK)

以下のコーディングにしようと思います。
アドバイス頂ければ幸いです。
<?php
  session_start();
  $_session["qstr"] = urldecode($_SERVER["QUERY_STRING"] );
  $_session["calltype"] = $_SERVER['HTTP_ACCEPT'];
  $_session["bwztype"] = $_SERVER['HTTP_USER_AGENT'];
   :
  // ブラウザ判別 処理 → $call に結果を入れる
   :
  // 以下 header()の処理
  if (       
    // <aと<img の区別がつく場合
    :
    :
  }else{    // 区別がつかない場合 →「出来るだけ救う」
   if (substr($_session["qstr"],0,2) == '//'){  //コマンド
     // こう来た時はHtmlの場合が多い。<aと書くようReadmeに記述してあるので
     header("Content-Type: text/html; charset=SJIS");
   }else if ($_session["qstr"] == "" ) {   //何の指定もない 
     header("Content-Type: text/html; charset=SJIS");
     exit; // 何の指定もなければ、空の画面でよい
   }else{   // 数式
     // こう来た時はgifの場合が多い。<imgと書くようReadmeに記述してあるので
     header('Content-Type: image/gif');
   }
  }
  // 初期設定
  require_once '../config.inc.php';  // mimeTeXのURL等を定義
  ini_set('allow_url_fopen', 1);
  mb_language("Japanese");
try{
  // encodingの判定
    :

お礼日時:2009/11/10 21:53

色々考えてみましたが、スマートでない方法なら思いつきました。


$_SERVER['HTTP_REFERER']
から、リファラーを取得して、
file_get_contents関数なり、fsockopen関数なりで、HTMLを取得してきて、
aタグとIMGタグをパーサなり、正規表現などを使って取得してきて、
そのリクエストされた値付のリンクがどちらで記述してあるかを判別する。

・・・そこまでする意味があるかといわれるとアレですが。
    • good
    • 0
この回答へのお礼

実は、最初この方法を試してみたのですが、
YahooのCGI環境(Geocities)では、file_get_contents関数で取得される
サイズは、約44kまでなのです。
しかし、Yahooブログは、72kもあり、Upした記事は、最後の方なのです。
というわけで、この方法は、使えませんでした。

>そこまでする意味があるかと
そうですね。
fsockopen関数は、よく知らないし、、、
商用ソフトじゃない と、わりきることにします。

お礼日時:2009/11/12 14:42

一番簡単なのは$callそのものをリンクに組み込んでしまうことなんですが、そんな回答を望んでいる訳ではないですよね‥‥。



>だいたいは、出来ています。
良くできていますねー感心しました。
    • good
    • 0
この回答へのお礼

お褒め頂いて、恐縮です。
量子力学のブログなんかやってますが、元SEです。
Javaでのイントラネットの経験はあるのですが、phpは、初めてで、
まして、<img で呼び出すのを作ったのは初めてです。
よろしくお願いします。

このCGIは、ユーザのブログやHPに(ユーザが書いて)置くものですから、
>$callそのものをリンクに組み込む
のでは、それを書き間違える可能性は、十分あります。
で、<img で書いた時は、(例え間違えても)ユーザは画像が出ることを期待してますし、
<a で書いた時は、(例え間違えても)それなりのHtmlが出ることを期待してます。
グチャグチャが出れば、まず当方のバグを疑われます。
というか「ソフトウエア製品」とみなしてもらえません。
( 「仕様通り」で突っぱねるのは、僕は嫌いです )
何とかなりませんか、、、

お礼日時:2009/11/10 19:13

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!