ユーザーにどの程度の制御を持たせたいですか?
これを実装するにはいくつかの方法があります。私が考えることができるすべてのアイデアの簡単な要約を提供します。
事前定義されたフィールドを持つ静的 HTML。
このアプローチを使用すると、完全に制御でき、セキュリティの脆弱性のリスクを最小限に抑えることができます。ユーザーごとの HTML をデータベース テーブルのどこかに保存します。この HTML には、を使用するなど、いくつかのマークアップを含む事前定義されたフィールドがあります{fieldName}
。次に、単純なパーサーを使用して中かっこを識別し、どこかfieldName
から取得した文字列値に置き換えます。Dictionary<String,String>
このアプローチは、文字列処理に精通している場合 (つまり、ステート マシン パーサーを使用して中かっこを見つけ、再構築された文字列を直接出力または StringBuilder に送信するなど、重要なことにを使用しないString.Replace
場合) 高速になります。欠点は、それが実際のテンプレート システムではないことです。結果セットのループ処理 (許可したい場合)、式の評価はありませんが、単純な「このコンテンツをこのスペースに挿入する」タイプのデザインでは機能します。
ユーザーが自分の ASPX または ASCX ファイルを編集できるようにします。
ASP.NET を使用できるのに、独自のテンプレート システムを構築する必要はありません。ええと、このアプローチは、迅速な "n" 汚れたレポート システムを構築したい場合に最も簡単ですが、セキュリティの点でひどく失敗します。残念ながら、ASP.NET の仕組みが原因で、サンドボックス内の ASPX ファイル内の<% %>
/コードを保護したり、CAS を使用したりすることはできません(私はこれを以前に調べました:ビューごとの ASP.NET MVC ベースでのコード アクセス セキュリティ)。<script runat="server">
実際の ASPX および ASCX ファイルを Web サイトのファイル システムに格納する必要はありません。VirtualPathProvider
実装を使用してファイルをデータベースに格納できますが、正しく動作させるのは少し面倒な場合があります (特に ASP.NETランタイムは ASPX ファイルをコンパイルするため、ユーザーが ASPX ファイルを変更した場合はランタイムに通知する必要があります)。また、ASPX の読み込みは (Routing または MVC を使用している場合を除いて) ユーザーの要求パスに関連付けられていることにも注意する必要があります。
本格的なテンプレート エンジンを実装する独自の CAS サンドボックスで実行されるカスタム ASP.NET ハンドラー
これは最も困難なオプションであり、2 つのオプションの間に存在します。アプリケーションを大きなセキュリティ上の欠陥にさらすことなく、一流のテンプレート エンジン (ループ、フィールド、必要に応じて評価) の柔軟性を得ることができます。欠点は、ほとんどすべてを自分で構築する必要があることです。ここでは詳しく説明しません。
どのオプションを選択するかは、要件によって異なります。MySpace のシステムは、「テンプレート化」というよりも「スキニング」に近いものでした。つまり、ユーザーは、ページの一般的なテンプレートを直接変更するのではなく、スタイルシートを自由に設定して任意の一般的な HTML を定義できました。
各スキン可能な機能がサブクラスとして実装されていると仮定すると、ASP.NET で MySpace のようなシステムを簡単に実装できControl
ます。メソッドを拡張してRender
、上記の任意の HTML を挿入できるようにするだけです。カスタム スタイルシートの追加も簡単です。<style type="text/css">
ページの 要素内に追加するだけ<head>
です。
<script>
ユーザーが HTML を直接入力できるようにする場合は、HTML を解析して危険な要素 ( 、<style>
、など)を除外することを強くお勧めします<object>
。YouTube 動画および関連の埋め込みを許可する場合は、<object>
要素を分析して実際に YouTube 動画であることを確認し、動画 ID を抽出してから、既知の信頼できるテンプレートから要素を再作成する必要があります。カスタム HTML は「タグのバランスが取れている」ことが重要です (XHTML は (技術的には) とにかく HTML のサブセットであるため、より寛容な HTML パーサーではなく、厳密な XML パーサーを介して渡すことでこれを確認できます)。カスタム マークアップはページを壊しません。
楽しむ。