‹ в текстовом поле в ASP.NET --› как это разрешить?

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

Спасибо :)


person grady    schedule 10.11.2010    source источник
comment
stackoverflow.com/questions/35504083/   -  person Sachin    schedule 19.02.2016
comment
@Sachin, это не имеет отношения к вопросу.   -  person goPlayerJuggler    schedule 22.03.2018


Ответы (7)


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

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

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

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

<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, который вы получаете.

person Artemiy    schedule 10.11.2010
comment
сбежать? Что ты имеешь в виду? Пример? - person Brettski; 10.11.2010
comment
Я не вижу никакого преимущества в побеге, а затем в отказе от себя, чем просто отключении проверки. В любом случае вам все равно нужно убедиться, что вы кодируете значения для повторного отображения. - person Tim Abell; 12.04.2011
comment
@TimAbell - Преимущество в том, что таким образом вы можете отключить проверку только для одного элемента управления, а не для всей страницы. - person Ivan Nikolov; 18.01.2012
comment
Справедливо. Спасибо за объяснение. - person Tim Abell; 18.01.2012
comment
Функция javascript escape теперь устарела. Вы должны использовать encodeURI(). - person Gabriel GM; 28.10.2013
comment
stackoverflow.com/questions/ 75980/ - person Frank Myat Thu; 30.06.2014

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

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

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

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

person Paul Spangle    schedule 10.11.2010
comment
да, он преобразует их, например, в, но я хочу видеть ‹ в текстовом поле, а не - person grady; 10.11.2010
comment
Он должен делать это только в том случае, если он уже выполняет кодирование, но тогда он не должен ошибаться в первую очередь. У вас есть образец кода или URL-адрес, который вы можете добавить к своему вопросу? И ошибка, которую вы получаете, если это возможно. - person Paul Spangle; 10.11.2010

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

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

person KallDrexx    schedule 10.11.2010
comment
Да, но мне нужно отображать его как › и ‹, а не html версии - person grady; 10.11.2010
comment
Когда он отображается на веб-сайте, он будет отображаться как ‹ ›. Коды символов HTML используются для отображения этих символов во время отображения, без их неправильного чтения во время рендеринга/компиляции. - person KallDrexx; 10.11.2010

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

<%@ 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();
});
person Emanuele Greco    schedule 15.11.2011
comment
Функция validateTxt отлично сработала для меня. Спасибо за ваш ответ - person Farid Imranov; 31.05.2017
comment
Он говорит, что ‹ tag› является опасной версией, но разве ваш validateTxt() не меняет их таким образом? - person crokusek; 24.08.2018

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

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

person Ta01    schedule 10.11.2010

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

<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>

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

person Yuriy Faktorovich    schedule 10.11.2010

ваша проблема в том, что вы не можете использовать теги 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 );
    }
person user2837480    schedule 02.10.2013