HDML Language

セキュリティについて

変数を扱うことのできるHDMLは大変便利ですが、その反面セキュリティに留意しないと危険なことが
あります。
ここでは、主にHDMLファイル側で対応できるセキュリティアップの方法について記述します。

商用サイトなどでは、このほかに基本認証や、SSL等によるセキュリティ対策が必要な場合もあるかと
思います。

個人のサイトでセキュリティに気を配る場面はあまりないと思いますが、知っていて損をすることは
ありませんので頭の片隅に置いてください。


■ PUBLICオプションによるアクセス制限

デッキ(カード)をあらゆるURLからアクセスできるようにするか否かを指定するオプションにより、
アクセス制限を行う。

値は、TRUE か FALSE のどちらか1つ。
デフォルト(省略時)は、PUBLIC=FAISEとなっており、アクセスできるのは、同じドメインのURLを持つ
デッキ(カード)のみとなる。
MARKABLE=TRUEオプションを指定した場合、自動的にPUBLIC=TRUEとなる。

  • PUBLIC=TRUE → アクセス可能
  • PUBLIC=FALSE → アクセス不可(デフォルト)

<HDML>タグまたは、各カード(DISPLAY/CHOICE/ENTRY)のオプション値として指定する。

<HDML VERSION=3.0 PUBLIC=TRUE>
<DISPLAY>
<ACTION TYPE=ACCEPT TASK=GO DEST=#e>
このカードはどこからでもアクセス可
</DISPLAY>
<ENTRY NAME=e PUBLIC=FALSE>
<ACTION TYPE=ACCEPT TASK=PREV>
このカードは同じドメイン内からのみアクセス可
</ENTRY>
</HDML>

セキュリティを保持しつつ、外部からのアクセスを可能にするには、ACCESSDOMAINオプション及びACCESSPATHオプションを使用するとよい(次項目参照)。




例1
アクセス可能(同じドメイン内の移動)
(http://mydomain.com/index.hdml)
<HDML VERSION=3.0>
<ACTION TYPE=ACCEPT TASK=GO
DEST="bdir/other.hdml">
<DISPLAY>
other.hdmlに行きたいな。
</DISPLAY>
</HDML>
other.hdmlに
行きたいな。

OK
(http://mydomain.com/bdir/other.hdml)
<HDML VERSION=3.0>
<DISPLAY>
index.hdmlから来るかな。
</DISPLAY>
</HDML>
index.hdmlから
来るかな。

OK



例2
アクセス不可(ドメイン名が違うとデフォルトではアクセス不可。
(http://mydomain.com/index.hdml)
<HDML VERSION=3.0>
<ACTION TYPE=ACCEPT TASK=GO
DEST="http://somedomain.com/index.hdml">
<DISPLAY>
somedomain.comに行きたいな。
</DISPLAY>
</HDML>
sumedomain.comに
行きたいな。

OK
ページエラー


詳細        OK
(http://somedomain.com/index.hdml)
<HDML VERSION=3.0>
<DISPLAY>
mydomain.comから来るかな。
</DISPLAY>
</HDML>
このページへのアクセ
スは拒否されました

OK



例3
例2をアクセス可能にする
(http://mydomain.com/index.hdml)
<HDML VERSION=3.0>
<ACTION TYPE=ACCEPT TASK=GO
DEST="http://somedomain.com/index.hdml">
<DISPLAY>
somedomain.comに行きたいな。
</DISPLAY>
</HDML>
sumedomain.comに
行きたいな。

OK
(http://somedomain.com/index.hdml)
<HDML VERSION=3.0 PUBLIC=TRUE>
<DISPLAY>
mydomain.comから来るかな。
</DISPLAY>
</HDML>
mydomain.comから
来るかな。

OK

Go to Top

■ACCESSDOMAIN及びACCESSPATHオプションによるアクセス制限
外部からアクセス可にしたいが、セキュリティも保持したいという時に指定するオプション。
<HDML>タグ内でのみ指定できる(PUBLIC=TRUEが指定されていると無視される)。
<HDML VERSION=3.0 ACCESSDOMAIN="somedomain.ne.jp" ACCESSPATH="/au">
ACCESSDOMAIN ・・・ PUBLIC=FALSEを指定した時、ここで指定するURLのドメインからの
アクセスのみを受け付けるようにできる。
デフォルトは、現在のデッキのドメインとなる。
ACCESSPATH ・・・ PUBLIC=FALSEを指定した時、ここで指定するディレクトリからの
アクセスのみを受け付けるようにできる。
デフォルトは、現在のデッキのパス。("/")



ACCESSDOMAINオプションとACCESSPATHオプションの組み合わせにより、どのような
アクセス制限が可能なのか、具体例を挙げてみます。
いずれも「PUBLIC=FALSE」が前提です。

例1「My First HDML EZサイト」のURLにおけるアクセス制限

"http://hdml.cside.com/index.hdml"というURLのデッキに以下のような
ACCESSDOMAINオプション及びACCESSPATHオプションがあった場合
ACCESSDOMAIN ACCESSPATH アクセスのデッキ アクセス不可のデッキ
指定なし
(デフォルト)
指定なし
(デフォルト)
http://hdml.cside.com/2.hdml
http://www.hdml.cside.com/3.hdml
http://hdml.cside.com/au/4.hdml
http://kimura.cside.com/2.hdml
kimura.cside.com 指定なし
(デフォルト)
http://kimura.cside.com/2.hdml
http://www.kimura.cside.com/2.hdml
http://hdml.cside.com/2.hdml
www.kimura.cside.com 指定なし
(デフォルト)
http://www.kimura.cside.com/2.hdml
http://www.kimura.cside.com/au/2.hdml
http://kimura.cside.com/2.hdml
http://hdml.cside.com/3.hdml
指定なし
(デフォルト)
/au http://hdml.cside.com/au/2.hdml
http://hdml.cside.com/au/ez/3.hdml
http://hdml.cside.com/2.hdml
http://hdml.cside.com/ez/1.hdml
kimura.cside.com /au http://kimura.cside.com/au/2.hdml
http://kimura.cside.com/au/ez/3.hdml
http://kimura.cside.com/2.hdml
www.cside.com 指定なし
(デフォルト)
http://www.cside.com/~hdml/2.hdml
http://www.cside.com/~hdml/au/2.hdml
http://hdml.cside.com/2.hdml
上記表の最後の例で、たとえ、「hdml.cside.com」が「www.cside.com/~hdml」の
  エイリアス名であった場合でも、「ACCESSDOMAIN="www.cside.com"」が指定されている限り、
  「http://hdml.cside.com/2.hdml」で読み込まれたデッキは、http://hdml.cside.com/index.hdml
  にアクセスできません。



例2 CGIファイルが特別のURLで実行される環境でのアクセス制限
私の知っている範囲では、interQ などでCGIファイルが別ディレクトリになっており、それを
実行させるのに、以下のように特別なURLを指定しなければなりません。

通常のHDMLデッキの呼び出し -> http://www.kimura.co.jp/cgi-bin/index.hdml
CGIファイルの呼び出し -> http://cgi.kimura.co.jp/cgi/kimura.co.jp/cgi-bin/some.cgi

このように、同じディレクトリ内にあるにもかかわらず、その呼び出し方が違うとき、上記
http://www.kimura.co.jp/cgi-bin/index.hdml のデッキに以下のようなACCESSDOMAIN
オプション及びACCESSPATHオプションが指定されている場合のアクセス制限です。

上記の環境にあてはまらない方は、ここを読むとかえって混乱するので読みとばしてください。

アクセス元のURL http://www.kimura.co.jp/cgi-bin/index.hdml
に指定されているアクセス制限
アクセス
可(○)
不可(×)
ACCESSDOMAIN ACCESSPATH
http://www.kimura.co.jp/2.hdml
指定なし 指定なし
kimura.co.jp 指定なし
www.kimura.co.jp 指定なし
指定なし /cgi-bin ×
kimura.co.jp /cgi/kimura.co.jp/cgi-bin ×
http://www.kimura.co.jp/cgi-bin/3.hdml 指定なし 指定なし
kimura.co.jp 指定なし
www.kimura.co.jp 指定なし
指定なし /cgi-bin
kimura.co.jp /cgi/kimura.co.jp/cgi-bin ×
http://cgi.kimura.co.jp/cgi/kimura.co.jp/cgi-bin/some.cgi 指定なし 指定なし ×
kimura.co.jp 指定なし
www.kimura.co.jp 指定なし ×
指定なし /cgi-bin ×
指定なし /cgi/kimura.co.jp/cgi-bin ×
kimura.co.jp /cgi/kimura.co.jp/cgi-bin

Go to Top

■SENDREFERER=TRUEによるアクセス制限
主に、CGIなど、外部アプリケーションへアクセスする際、呼び出し元が正当なデッキ(URL)であるか
どうかを見きわめるための指定です。
HDMLデッキは、デフォルトでは、自分のURLをHTTPヘッダに設定しません。
この、「SENDREFERER=TRUE」を指定した時のみ、HTTPヘッダにURL情報を付加します。
<ACTION>、<A></A>、<CE>タグ内で指定できます。
<HDML VERSION=3.0>
<NODISPLAY>
<ACTION TYPE=ACCEPT TASK=GO DEST="some.cgi" SENDREFERER=TRUE>
</NODISPLAY>
</HDML>
もちろん、上記のようにHDML側で「SENDREFERER=TRUE」を指定しても、それを受け取る側の
外部アプリケーション(CGI等)でRefererヘッダをチェックしなければ意味がありません。
Perlスクリプトの場合、以下のようなルーチンを追加します。
@receiveRefs = ('http://mydomain.com/index.hdml',
 'http://mydomain.com/index.hdml')

local($checkRef) = 0;
$refURL = $ENV{'HTTP_REFERER'};
$refURL =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
if ($refURL){
 foreach $receiveRef (@receiveRefs) {
  if ($refURL =~ /$receiveRef/) {
   $checkRef = 1;
   last;
  }
 }
}
else { $checkRef = 1; }
if ($checkRef !=1) { &errorExit ('不正なアクセスです') } ;

sub errorExit {
 print <<"ERR"
Content-type:text/x-hdml;charset=Shift_JIS

<HDML VERSION=3.0 TTL=0>
<DISPLAY>
<CENTER>!エラー!<BR><CENTER>
@_
</DISPLAY></HDML>
ERR
 exit; }

上記のルーチンでは、直接CGIファイルを指定した場合(Refererヘッダが "空" の時)は、
  アクセスを認めてしまいます。Refererヘッダが "空" の時、アクセス拒否するには、太字の部分
  else { $checkRef = 1; } を削除します。

Go to Top

■「FRIEND=TRUE」の危険性
通常は、サブアクティビティ側から呼び出し元のアクティビティの変数をクリアすることはできません。
しかし、サブアクティビティ起動(「TASK=GOSUB」)時に、「FRIEND=TRUE」オプションを指定すると、
以下のようなことが可能になります。
  • サブアクティビティ側で「TASK=RETURN」及び「CREAR=TRUE」オプションを指定することにより、呼び出し先のサブアクティビティ側から、呼び出し元のアクティビティの変数をすべてクリアできる。

  • サブアクティビティ側で「TASK=(RETURN |CANCEL)」及び「DEST=」オプションを指定する
    ことにより、呼び出し元の「NEXT」及び「CANCEL」の指定を無効にして、「DEST=」で指定した
    URLにジャンプさせることができる。

この「FRIEND=TRUE」は、<ACTION>、<A></A>、CE>、タグ内で指定でき、便利なので、つい多用してしまいがちですが、場合によっては危険なオプション指定なのです。以下に注意点を記します。

  1. 外部(自サイト以外)にリンクする際に「FRIEND=TRUE」を指定してはならない。

    • 自分(自社)以外の手により、更新される可能性のあるデッキに対して「FRIEND=TRUE」
      を指定すると、リンク先のデッキ(カード)に「TASK=(RETURN|CANCEL)」及び
      「DEST=」オプションがあると、強制的に「DEST=」で指定したURLに飛ばされてしまう
      可能性があります。

    • また、リンク先のデッキ(カード)に「TASK=RETURN」及び
      「CLEAR=TRUE」オプションがあると、呼び出し元である自分(自社)の
      アクティビティ内変数をすべてクリアされてしまう可能性があります。

  2. ユーザーがジャンプ先(DESTオプション)を入力できるようなカードに対して「FRIEND=TRUE」を
    指定してはならない。

    • ENTRYカードでユーザーにURLを入力させて、そのURLにジャンプするように指定して
      あると、ジャンプ先のデッキ(カード)の記述次第で、項目1で説明したような危険の
      可能性があります。

  3. 機密情報が含まれるアクティビティ内で「FRIEND=TRUE」を指定してはならない。

    • サブアクティビティ側から呼び出し元アクティビティの全変数にアクセスが可能になってしまいますので、呼び出し元アクティビティ内の変数に機密情報が含まれていると危険です。

デフォルト(省略時)では、「FRIEND=FALSE」ですので、通常は、上記のようなことを意識しなくても
よいですが、もし、現在、サイト内で「FRIEND=TRUE」オプションを指定しているデッキ(カード)が
あるのならば、今一度、ジャンプ先のサブアクティビティをチェックしてみてください。

Go to Top


Home Pageに戻る

最終更新日:2003年1月23日