0

ASP.NETMVC2.0でこれを使用できるようになりました <%: Model.CustomerName %>

では、HTMLヘルパーを作成するときは、この方法を使用する方がよいでしょうか(HTMLエンコードを実行したくない場合)。

4

2 に答える 2

2

<%: %>ウェブページをより安全にするために、ユーザーが入力/送信したデータを表示するときはいつでも使用する必要があります。

しかし、すべてを HTML エンコードするのは現実的ではない場合もあります。HTML フォーマットを保持したい場合はどうすればよいでしょうか。この場合、通常の<%= %>ステートメントを使用する必要があります。これが当てはまる例を考えてみましょう。

実際の例

ユーザーがコメントを送信できる Web コンテンツがあるとします。いくつかのフォーマット (少なくとも改行)を保持する機能を提供したいと考えています。この場合<br/>、後でこれらのコメントを表示するときに要素を保持する必要があります。次の 2 つの選択肢があります。

  1. コメントを DB に保存するときに、コメントをクリーンアップしてフォーマットします。この場合、送信されたコメントからすべての HTML タグを取り除き、すべての改行 (\n) を<br/>. このコメントを表示したい場合は、呼び出すことができます<%= Comment %>
  2. コメントを表示するときにクリーンアップしてフォーマットします。この場合、おそらくこれを呼び出します<%= Html.Encode(Comment).Replace("\n", "<br/>") %>

どちらが優れている/安全であるかは、それぞれのケースによって異なりますが、HTML タグをクリーンアップすることは、常に 2 つのいずれかに含めることをお勧めします。すべては、許可されたフォーマット定義にも依存します。それらを通常のタグとして入力するか、マークダウンに似たものにするか、まったく異なるものにするかは、あなた次第であり、最終的なコードは間違いなくそれに依存します。

2 番目のアプローチの長所と短所

  • 利点
    いくつかの書式設定機能を提供しているが、約 1 年ほど後に、書式設定ルールまたはそれに関連する何かを変更することを決定したとします (これは非常に一般的です)。2 番目のアプローチを使用する場合、古いコメントはそのまま保存されているため、新しいルールは古いコメントでも機能しますが、最初のアプローチは古いデータではその意味が失われます。1 つの例は、クリーンアップ/フォーマット フェーズでこれらのコメント内の Web リンクを自動検出する場合です。最初のアプローチを使用すると、古いコメント内のすべてのリンクはクリックできないままになりますが、2 番目の方法を使用すると、リンクを含む古いコメントでもクリック可能な形式になります。
  • 不利な点2 番目のアプローチでは、すべてのコメントを表示するたび
    に前処理する必要があるため、最初のアプローチよりもはるかに多くの処理を使用しますが、最初のアプローチでは、コメントを DB に保存するときに 1 回だけ処理されます。書式設定/クリーンアップの複雑さと各ページのコメントの量によっては、これが重要になる場合があります。 処理が問題になる場合は、最初のアプローチを使用する代わりの方法を考える必要がありますが、コメントをクリーンアップして再フォーマットする際に、両方のバージョンを DB に保存します。元の送信されたコメントと処理されたコメント。したがって、元のコメントを保存しているため、フォーマット ルールを変更する場合は、いつでも古いコメントを再フォーマットできます。
于 2010-05-18T10:12:53.990 に答える
1

<%: Model.CustomerName %>はい、いつでも使えるところはこれからも使いたいですよね。非常に特殊な場合にのみ使用する必要があります<%= %>が、まったく使用しないようにしてください。

エンコードしたくない独自の html ヘルパーを作成している場合はMvcHtmlString、それらから a を返すだけです。

たとえば、これは、渡された値が true の場合に目盛りアイコンを表示するために作成した拡張メソッドです。

public static MvcHtmlString MECross(this HtmlHelper html, string value, string text)
{
    if (Convert.ToBoolean(value))
    {
        string spanTag = string.Format("<span class=\"replace icon-cross\" title=\"{0}\"><em></em>{1}</span>",
                                        html.AttributeEncode(text),
                                        html.Encode(text));

        return MvcHtmlString.Create(spanTag);
    }

    return MvcHtmlString.Empty;
}

EncodeIおよびAttributeEncode拡張メソッドで危険な可能性があるものはすべて、 を返すことに注意してくださいMvcHtmlString

HTH、
Chares

于 2010-05-17T22:49:12.077 に答える