2009-07-08 30 views
2

テンプレートからユーザーが作成したaspxページがいくつかあります。いくつかの文字列置換($ {フィールド名}とanyting)が包含されるので、テンプレートの一部は次のようになります。テンプレート内の文字列置換を

<% 
    string title = @"${title}"; 
%> 
<title><%=HttpUtility.HtmlEncode(title) %></title> 

のaspxファイルは、このテンプレートから作成された場合、$ {タイトル}が置き換えられますユーザが入力した値。

しかし明らかに、彼らは入力文字列の二重引用符を閉じるだけで任意のHTMLを挿入できます。これをどうやって回避するのですか?私はそれが明白であるように感じるが、私はこれを回避する方法を考え出すことができない。

私はテンプレートのインスタンス化プロセスを制御できません。私はそれを与えられたものとして受け入れる必要があります。

答えて

1

あなたは別のファイル(多分XML)やデータベースにその値を格納することはできますか?そうすれば、彼らの入力はあなたのページにコンパイルされません。次に、データを変数に読み込むだけです。それであなたが気にしなければならないことは、あなたのhtmlエンコードが扱うhtmlです。

+0

これは動作する唯一の方法のようです - 値は何らかの保持領域に入れられ、別のプロセスが読み取ってaspxテンプレートに注入します。 – Clyde

0

文字列に二重引用符を含めると、任意のHTMLではなく任意のコードが挿入されますが、それはさらに悪化します。

正規表現を使用して入力文字列をフィルタリングすることができます。私は危険な文字を除外しようとするよりもむしろインクルーシブな正規表現を使用します。 A-Za-z0-9と空白のみを許可します。

+0

あなたはそうだと思いますが、コードまたはHTMLのいずれかを挿入できます。 他の回答への私のコメントと同様、私は変数にそれを取り入れることができないので、事実の後にそれを処理するのは難しいです。 この操作は、一般ユーザーではなくログインしているユーザーによって行われるため、私が居ることができるかもしれません。しかし、私はITスタッフからの逃げ道を避けるための方法があることを期待していました。 – Clyde

+0

変数をテンプレートに適用するコードは制御しないでください。 –

0

ない私は完全に理解してください、しかし...

ではなく、それをコードするHTMLのタイトルからHTMLを取り除くために正規表現を使用してみてください:

public string StripHTML(string text) 
{ 
    return Regex.Replace(text, @”<(.|\n)*?>”, string.Empty); 
} 

が可能、このですか?

<% 
    string title = Regex.Replace(@"${title}", @”<(.|\n)*?>”, string.Empty); 
%> 

または

<title><%=HttpUtility.HtmlEncode(System.Text.RegularExpressions.Regex.Replace(title, @"<(.|\n)*?>", string.Empty)) %></title> 
+0

テンプレート置換テキストを変数 'text'に安全に挿入するにはどうすればよいですか?それが全体の問題です! – Clyde

+0

エンドユーザーはどのようにテンプレートを作成していますか?ディスプレイ上ではなく保存時にコンテンツをフィルタリングできますか? – BigBlondeViking

+0

私はテンプレートを作成しています - 私の質問のコードは、私が制御できるコードです。 「テンプレートから新しいファイルを作成する」というボタンを押すと、「タイトル」を入力できるフォームが表示されます。作成されたファイルは、すべての$ {}タグを置き換えたテンプレートファイルのコピーを取得します。 – Clyde

関連する問題