У меня есть текстовое поле, которое отображает строку, содержащую ‹ и >. Код выдает ошибку из-за этого. Как я могу разрешить использование этих символов в моем текстовом поле?
Спасибо :)
У меня есть текстовое поле, которое отображает строку, содержащую ‹ и >. Код выдает ошибку из-за этого. Как я могу разрешить использование этих символов в моем текстовом поле?
Спасибо :)
Проблема в том, что когда это будет отправлено на сервер, оно не будет работать, независимо от того, что вы пытаетесь. Это защита 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, который вы получаете.
escape
теперь устарела. Вы должны использовать encodeURI()
.
- person Gabriel GM; 28.10.2013
Если вы находитесь на странице asp.net, вы можете обернуть весь выходной текст в Server.HtmlEncode("YourTextWith<and>Characters")
функция, и она будет кодировать любые хитрые символы для вас.
Если по какой-то причине вы делаете это в файле .cs, вы можете использовать System.Web.HttpUtility.HtmlEncode("YourTextWith<and>Characters")
перед передачей его на уровень представления.
Преобразуйте их в <
и >
. В HTML <
преобразуется в <
, а >
преобразуется в >
, не считая его частью разметки. Таким образом, строка <Blah>
будет <Blah>
.
Редактировать: я забыл, чтобы автоматически преобразовывать их и экранировать все символы HTML (так что это не проблема для других вещей), в Asp.net вы можете использовать Server.HtmlEncode(string)
для автоматического преобразования всех символов, которые могут вызвать вопросы к их HTML-эквиваленту.
Самое простое решение — отключить проверку запросов на отдельных страницах.
<%@ 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();
});
validateTxt
отлично сработала для меня. Спасибо за ваш ответ
- person Farid Imranov; 31.05.2017
<asp:TextBox ID="TextBox1" runat="server"><</asp:TextBox>
Я не знаю, связан ли ваш вопрос с этим или вы получаете проблему с подтверждением запроса.
Вы можете либо использовать свойство TextBox.Text
, которое будет HTML-кодировать все, что вы вводите
<asp:TextBox ID="TextBox1" runat="server" Text="<>"></asp:TextBox>
или вы можете ввести html-имена для <
и >
.
<asp:TextBox ID="TextBox1" runat="server"><</asp:TextBox>
или вы можете ввести html коды
<asp:TextBox ID="TextBox1" runat="server"><</asp:TextBox>
для преобразований имен и кодов см. эту диаграмму.
ваша проблема в том, что вы не можете использовать теги 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 );
}