«<» в текстовом поле в ASP.NET -> как это разрешить? - PullRequest
13 голосов
/ 10 ноября 2010

У меня есть текстовое поле, в котором отображается строка, содержащая <и>. Код выдает ошибку из-за этого. Как я могу разрешить использование этих символов в моем текстовом поле?

Спасибо:)

Ответы [ 7 ]

22 голосов
/ 10 ноября 2010

Проблема в том, что когда это будет опубликовано на сервере, оно не будет работать, неважно, что вы пытаетесь. Это защита ASP.NET XSS, которую можно отключить следующим образом:

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

Проблема в том, что вам нужно быть очень осторожным, проверяя всю обратную передачу самостоятельно. Более простой способ - экранировать все содержимое текстового поля, используя JavaScript перед публикацией. Вы можете избежать этого, используя тот же HTML-код, а затем удалить его в коде на стороне сервера.

Обновление: Пример побега. Это будет мигать измененный текст на экране перед обратной передачей - идеальное решение состоит в том, чтобы использовать скрытое поле для этого, то есть назначить значение для скрытого поля, а не того же поля. Это самая простая версия:

<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();")

Обновление: Опять же, предупреждение - если вы сохраните HTML-код в своей базе данных таким образом, а затем просто отобразите его клиенту, вы напрямую уязвимы для атак XSS. Есть черви, которые найдут и используют ваш веб-сайт. Убедитесь, что вы очищаете полученный HTML-код.

8 голосов
/ 10 ноября 2010

Если вы находитесь на странице asp.net, вы можете обернуть весь выводимый текст в Server.HtmlEncode("YourTextWith<and>Characters")

функция, и она будет кодировать любые хитрые символы для вас.

Если по какой-то причине вы делаете это в файле .cs, вы можете использовать System.Web.HttpUtility.HtmlEncode("YourTextWith<and>Characters")

перед передачей на уровень представления.

4 голосов
/ 10 ноября 2010

Преобразуйте их в &lt; и &gt;. В Html &lt; конвертируется в <, а &gt; конвертируется в >, не считая его частью разметки. Таким образом, строка <Blah> будет &lt;Blah&gt;.

Редактировать : Я забыл автоматически конвертировать их и экранировать все символы HTML (так что это не проблема для других вещей), в Asp.net вы можете использовать Server.HtmlEncode(string), чтобы автоматически конвертировать все символы, которые могут вызвать проблемы в их HTML-эквиваленте.

2 голосов
/ 15 ноября 2011

Самое простое решение - отключить проверку запросов на отдельных страницах

<%@ 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();
});
0 голосов
/ 02 октября 2013

Ваша проблема в том, что вы не можете использовать HTML-теги в элементах управления .net.поэтому установите ValidateRequest = "false" на странице aspx и закодируйте текст перед сохранением текста.

    //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 голосов
/ 10 ноября 2010

Вы можете использовать свойство TextBox.Text, которое будет кодировать HTML-код, независимо от того, что вы вводите

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

, или вы можете ввести html-имена для < и >.

* 1008.*

или вы можете ввести html коды

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

для преобразования имен и кодов, посмотрите этот график.

0 голосов
/ 10 ноября 2010
<asp:TextBox ID="TextBox1" runat="server">&lt;</asp:TextBox>

Я не знаю, связан ли ваш вопрос с этим или вы получаете проблему validateRequest

...