テンプレートページ
4D の Webサーバーでは、タグを含む HTMLテンプレートページを使用することができます。 つまり、静的な HTMLコードと、4DTEXT、4DIF、4DINCLUDEなどの 変換タグ によって追加された 4D参照の組み合わせです。 これらのタグは通常、HTMLタイプのコメント (<!--#4DTagName TagValue-->
) として、HTMLソースコードに挿入されます。
これらのページが HTTPサーバーから送信される際、ページは解析され、含まれているタグが実行され、結果のデータに置き換えられます。 このように、ブラウザーが受け取るページは、静的な要素と 4D の処理による値が組み合わさったものです。
たとえば、HTMLページ内にて以下のように記述すると:
<P><!--#4DTEXT vtSiteName--> へようこそ! </P>
4D変数 vtSiteName の値が HTMLページに挿入されます。
テンプレート用タグ
以下の 4Dタグを使用することができます:
- 4DTEXT: 4D変数および式をテキストとして挿入します。
- 4DHTML: HTMLコードを挿入します。
- 4DEVAL: 4D式を評価します。
- 4DSCRIPT: 4Dメソッドを実行します。
- 4DINCLUDE: ページを他のページに含めます。
- 4DBASE: 4DINCLUDE タグが使用するデフォルトフォルダーを変更します。
- 4DCODE: 4Dコードを挿入します。
- 4DIF, 4DELSE, 4DELSEIF, 4DENDIF: HTMLコードに条件式を挿入します。
- 4DLOOP, 4DENDLOOP: HTMLコードにループを挿入します。
- 4DEACH, 4DENDEACH: コレクション内、エンティティセレクション内、またはオブジェクトのプロパティをループします。
これらのタグについては、変換タグ のページで説明しています。
タグは混在させることが可能です。 たとえば、次のような HTMLコードが認められています:
<HTML>
...
<BODY>
<!--#4DSCRIPT/PRE_PROCESS--> (メソッド呼び出し)
<!--#4DIF (myvar=1)--> (If 条件)
<!--#4DINCLUDE banner1.html--> (サブページ挿入)
<!--#4DENDIF--> (End if)
<!--#4DIF (myvar=2)-->
<!--#4DINCLUDE banner2.html-->
<!--#4DENDIF-->
<!--#4DLOOP [TABLE]--> (カレントセレクションでのループ)
<!--#4DIF ([TABLE]ValNum>10)--> (If [TABLE]ValNum>10)
<!--#4DINCLUDE subpage.html--> (サブページの挿入)
<!--#4DELSE--> (Else)
<B>Value: <!--#4DTEXT [TABLE]ValNum--></B><br/> (フィールド表示)
<!--#4DENDIF-->
<!--#4DENDLOOP--> (End for)
</BODY>
</HTML>
タグの解析
最適化のため、".HTML" または ".HTM" を末尾に持つ単純な URL で HTMLページを呼び出した場合、4D Webサーバーは HTMLソースコードの解析をおこないません。
4D Web サーバーが送信するテンプレートページの解析は、WEB SEND FILE
(.htm, .html, .sthtm, .shtml)、WEB SEND BLOB
(text/html type BLOB)、または WEB SEND TEXT
コマンドが呼び出されたとき、および URL を使用して呼び出されたページを送信するときにおこなわれます。 URL で呼び出す場合、".htm" と ".html" で終わるページは最適化のため解析されません。 この場合に HTMLページの解析を強制するには、末尾を ".shtm" または ".shtml" とする必要があります (例: http://www.server.com/dir/page.shtm
)。 このタイプのページの使用例は、WEB GET STATISTICS
コマンドの説明に記載されています。 XMLページ (.xml、.xsl) もサポートされており、常に 4D によって解析されます。
PROCESS 4D TAGS
コマンドを使用すると、Webコンテキスト外でも解析をおこなうことができます。
内部的には、パーサーは UTF-16 文字列で動作しますが、解析するデータは異なる方法でエンコードされている場合があります。 タグにテキストが含まれている場合 (4DHTML
など)、提供されている情報 (charset) や出所に応じて、4D は必要に応じてデータを変換します。 以下に、HTMLページに含まれるタグを 4D が解析する場合と、おこなわれる変換を示します:
動作 / コマンド | 送信ページの解析 | $シンタックスのサポート(*) | タグ解析に使用される文字セット |
---|---|---|---|
URL で呼び出されたページ | ○、ただし拡張子が ".htm" または ".html" のページを除く | ○、ただし拡張子が ".htm" または ".html" のページを除く | ページの "Content-Type" ヘッダーのパラメーターに渡された文字セットに従います。 それが無い場合は、META-HTTP EQUIVタグを探します。 それも無ければ、HTTPサーバーのデフォルト文字セットを使用します。 |
WEB SEND FILE | ○ | - | ページの "Content-Type" ヘッダーのパラメーターに渡された文字セットに従います。 それが無い場合は、META-HTTP EQUIVタグを探します。 それも無ければ、HTTPサーバーのデフォルト文字セットを使用します。 |
WEB SEND TEXT | ○ | - | 変換は不要です。 |
WEB SEND BLOB | ○ (BLOBが "text/html" 型の場合) | - | レスポンスの "Content-Type" ヘッダーに指定された文字セットを使います。 それも無ければ、HTTPサーバーのデフォルト文字セットを使用します。 |
<!--4DINCLUDE --> タグによる挿入 | ○ | ○ | ページの "Content-Type" ヘッダーのパラメーターに渡された文字セットに従います。 それが無い場合は、META-HTTP EQUIVタグを探します。 それも無ければ、HTTPサーバーのデフォルト文字セットを使用します。 |
PROCESS 4D TAGS | ○ | ○ | テキストデータは変換しません。 BLOBデータは、互換性のために Mac-Roman 文字セットから自動変換されます。 |
(*) 4DHTML、4DTEXT、4DEVALタグにおいては、代替の $ベースシンタックスが利用可能です。
Webから 4Dメソッドへのアクセス
4DEACH
、4DELSEIF
、4DEVAL
、4DHTML
、4DIF
、4DLOOP
、4DSCRIPT
、または 4DTEXT
で Webリクエストから 4Dメソッドを実行できるか否かは、メソッドプロパティの 公開オプション: 4D タグと URL(4DACTION...) 属性の設定に依存します。 この属性がチェックされていないメソッドは、Webリクエストから呼び出すことができません。
悪意あるコードの侵入を防止
4D変換タグは様々なタイプのデータを引数として受け入れます: テキスト、変数、メソッド、コマンド名、…。 これらのデータが自分で書いたコードから提供される場合、その受け渡しを自分でコントロールできるので、悪意あるコードの侵入のリスクは無いと言っていいでしょう。 しかしながら、 データベースのコード扱うデータは多くの場合、外部ソース (ユーザー入力、読み込み、等) から導入されたものです。
この場合、4DEVAL
や 4DSCRIPT
などの変換タグは 使用しない のが賢明です。なぜならこれらの タグはこういったデータが格納された変数を直接評価するからです。
これに加え、繰り返しの原則 に従い、悪意あるコード自身が変換タグを含んでいる可能性もあります。 この場合、4DTEXT
タグを使用しなくてはなりません。 例として、"Name" という名前の Webフォームフィールドがあり、ユーザーがそこに名前を入力する場合を考えます。 この名前は <!--#4DHTML vName-->
タグを使用してページ内に表示されます。 もし "<!--#4DEVAL QUIT 4D-->
" というテキストが名前の代わりに入力されたとしたら、このタグを解釈するとアプリケーションは終了してしまいます。 このリスクを避けるには、4DTEXT
タグを使用することで対応できます。 このタグは特殊 HTML文字をエスケープするため、挿入された悪意ある再起的コードが解釈されることはありません。 前の例でいうと、"Name" フィールドには "<!--#4DEVAL QUIT 4D-->
" が含まれることになり、これは変換されません。