web-dev-qa-db-ja.com

ASP.NETのテキストボックスに "<"->許可する方法

<と>を含む文字列を表示するテキストフィールドがあります。そのため、コードはエラーをスローします。テキストフィールドでこれらの文字の使用を許可するにはどうすればよいですか?

ありがとう:)

13
grady

問題は、これがサーバーに投稿されたときに機能しないこと、何を試しても問題ないことです。これはASP.NET XSS保護であり、次のように無効にできます。

<%@ Page ... ValidateRequest="false" %>

問題は、すべてのポストバックを自分で検証する場合は、非常に慎重に行う必要があることです。より簡単な方法は、投稿する直前にJavaScriptを使用してテキストボックスのすべてのコンテンツをエスケープすることです。同じHTMLエスケープを使用してエスケープし、サーバー側のコードでエスケープを解除できます。

pdate:エスケープの例。これにより、ポストバックの前に画面上の変更されたテキストが点滅します。理想的な解決策は、これに非表示フィールドを使用することです。つまり、同じフィールドではなく、非表示フィールドに値を割り当てます。これは最も単純なバージョンです。

<script>
  function EscapeField(){
    document.getElementById("your client control ID").value = 
       escape(document.getElementById("your client control ID").value);
  }
</script>

そしてコードビハインドでは:

this.ClientScript.RegisterOnSubmitStatement(this.GetType(), 
    "EscapeField", "EscapeField();")

pdate:繰り返しますが、警告-このようにデータベースにHTMLを保存し、それをクライアントに表示するだけでは、XSS攻撃に対して直接脆弱です。 Webサイトを見つけて悪用するワームが世の中に存在します。取得するHTMLを必ずクレンジングしてください。

22
Artemiy

Asp.netページにいる場合は、出力テキスト全体をServer.HtmlEncode("YourTextWith<and>Characters")でラップできます。

関数とそれはあなたのために怪しげな文字をエンコードします。

何らかの理由で.csファイルでこれを行っている場合は、System.Web.HttpUtility.HtmlEncode("YourTextWith<and>Characters")を使用できます

プレゼンテーション層に渡す前。

8
Paul Spangle

それらを_&lt;_および_&gt;_に変換します。 HTMLでは、_&lt;_は_<_に変換され、_&gt;_はマークアップの一部であるとは見なされずに_>_に変換されます。したがって、文字列_<Blah>_は_&lt;Blah&gt;_になります。

編集する:私はそれらを自動的に変換してすべてのHTML文字をエスケープすることを忘れていたので(これは他の問題ではありません)、Asp.netではServer.HtmlEncode(string)を使用して、問題を引き起こす可能性のあるすべての文字を自動的に変換できます同等のHTML。

4
KallDrexx

最も簡単な解決策は、単一のページでリクエストの検証を無効にすることです

<%@ Page ... ValidateRequest="false" %>

しかし、requestValidationMode = "2.0"を有効にすることを忘れないでください

<system.web>
   ...
   <httpRuntime requestValidationMode="2.0" />
</system.web>

このソリューションは、いくつかの脅威を逃れる可能性があります。


別のスマートなソリューションはユーザーが記述したjavascriptテキストを介して置換して検証を安全にすることです:<tag>は危険だと考えられていますが、< tag>は安全と見なされています!

JavaScriptを置き換えることで問題を解決できます。

function validateTxt() {
    $("textarea, input[type='text']").change(function () {
      html = $(this).val(); //get the value
      //.replace("a" , "b")  works only on first occurrence of "a"
      html = html.replace(/< /g, "<"); //before: if there's space after < remove
      html = html.replace(/</g, "< "); // add space after <
      $(this).val(html); //set new value
   });
}

$(document).ready(function () {
      validateTxt();
});
2
Emanuele Greco
<asp:TextBox ID="TextBox1" runat="server">&lt;</asp:TextBox>

あなたの質問がこれに関連しているか、validateRequestの問題が発生しているかはわかりません

0
Ta01

あなたの問題は、.netコントロールでhtmlタグを使用できないことです。したがって、aspxページでValidateRequest = "false"を設定し、テキストを保存する前にテキストをエンコードします。

    //encode
    private string Encode(string text)
    {
        byte[] encodedText = System.Text.Encoding.UTF8.GetBytes(text);
        return System.Convert.ToBase64String(encodedText);
    }

テキストを取得するときは、エンコードされたテキストを必ずデコードしてください。

    // Decode:
    private string Decode(string encodedText)
    {
        byte[] decodedText = System.Convert.FromBase64String(encodedText);
        return System.Text.Encoding.UTF8.GetString(decodedText );
    }
0
user2837480

入力したものをすべてHTMLエンコードするTextBox.Textプロパティを使用することもできます。

<asp:TextBox ID="TextBox1" runat="server" Text="<>"></asp:TextBox>

または、<および>のHTML名を入力できます。

<asp:TextBox ID="TextBox1" runat="server">&lt;</asp:TextBox>

または、htmlコードを入力できます

<asp:TextBox ID="TextBox1" runat="server">&#60;</asp:TextBox>

名前とコードの変換については、 this チャートを確認してください。

0