Как я могу ввести кавычки в "белый список" на HtmlEncode?
Привет всем!
Я использую asp.net mvc 3 и AntiXssLibrary 4.2, и я пытаюсь кодировать текст с одинарными или двойными кавычками, и проблема в том, что я получаю ' "
вместо "или" и на иврите они очень полезны (например, רמב"ם или צ'ק). Я знаю, что там включены иврит и параметр по умолчанию для этого метода:
UnicodeCharacterEncoder.MarkAsSafe(
LowerCodeCharts.Default | LowerCodeCharts.Hebrew,
LowerMidCodeCharts.None,
MidCodeCharts.None,
UpperMidCodeCharts.None,
UpperCodeCharts.None);
Я пробую все методы кодирования без ожидаемого результата.
РЕДАКТИРОВАТЬ:
для моей второй проблемы, которую я пытаюсь поставить на мой взгляд строку HTML, как это
return new HtmlString(Encoder.HtmlEncode(resFile));
и я получаю все html-формат вместо отображаемой страницы, проблема была в том, что Microsoft переместила GetSafeHtml()
метод сборки HtmlSanitizationLibrary - я нахожу его в этом ответе и скачиваю его отсюда. Теперь я могу использовать это так
return new HtmlString(Sanitizer.GetSafeHtml(questionsAnswerString));
После этого, конечно, я добавил ссылку
using Microsoft.Security.Application;
Теперь я застрял с какой-либо помощью этих qoutes?
2 ответа
Я извиняюсь за неприятности, но невозможно поставить эти символы в белый список. мы можем увидеть зайца в справочном источнике Microsoft MarkAsSafe
, он звонит ApplyHtmlSpecificValues()
и там мы можем увидеть
private static void ApplyHtmlSpecificValues() {
characterValues['<'] = "lt".ToCharArray();
characterValues['>'] = "gt".ToCharArray();
characterValues['&'] = "amp".ToCharArray();
characterValues['"'] = "quot".ToCharArray();
characterValues['\''] = "#39".ToCharArray();
}
В любом случае они сохраняют эти символы, поэтому вы не сможете получить их после кодирования.
Таким образом, единственное решение, которое я счел целесообразным для вызова этой функции, всегда из одного места и после ее выполнения просто изменял символ обратно:(
return Encoder.HtmlEncode(input).Replace(""", "\"").Replace("'", "'");
10x;)
Хорошо, если вы получите ' "
на HTML-странице, которая отображается, мне приходит в голову, что вы сталкиваетесь с проблемой двойного HTML-кодирования.
Чтобы воспроизвести ситуацию, скопируйте и вставьте код Replication: в одно из своих представлений и убедитесь сами в этом.
HtmlString
а также MvcHtmlString
не должны кодировать HTML-строку, которая уже закодирована. Так что в вашем случае либо
return new HtmlString(Encoder.HtmlEncode(resFile));
или же
Sanitizer.GetSafeHtml(questionsAnswerString)
возвращает строку в кодировке Html, после чего в представлении вы фактически кодируете ее еще раз.
Это может произойти, потому что, по вашему мнению, которое фактически отображает ваш контент, вы используете бритву
@alreadyHtmlEncodedString
// razor's @ syntax html encodes the given string
//(irrespective of the fact that the given string is not html encoded
//or the given string is html encoded already or whatever.
//it just encodes the given string)
или aspx
<%:alreadyHtmlEncodedString%>
// aspx's <%: %> html encodes the given string
//(irrespective of the fact that the given string is not html encoded
//or the given string is html encoded already or whatever.
//it just encodes the given string)
Так что, если это так. Либо используйте Html.Raw для строки, которая уже закодирована в формате HTML. Или просто полагайтесь на синтаксис @ бритвы для небезопасной строки, не закодированной в формате html, в зависимости от того, какой путь вам нужен.
- Репликация:
Ниже приведен код для репликации вашего сценария, если это поможет. И образец вывода, а также изображение. Поместите приведенный ниже код в один из ваших просмотров.
@{string quotes = @"'""";
string quotesHtmlEncoded = Html.Encode(@"'""");
string hebrew = @"like רמב""ם or צ'ק";
string hebrewHtmlEncoded = Html.Encode(@"like רמב""ם or צ'ק");
string sampleXss = "<script>alert('1')</script>";
string sampleXssHtmlEncoded = Html.Encode("<script>alert('1')</script>");
}
<table border="1">
<thead>
<tr>
<th></th>
<th>razor @@
</th>
<th>Raw
</th>
<th>MvcHtmlString.Create
</th>
</tr>
</thead>
<tbody>
<tr>
<td>quotes
</td>
<td>
@quotes
</td>
<td>
@Html.Raw(quotes)
</td>
<td>
@MvcHtmlString.Create(quotes)
</td>
</tr>
<tr>
<td>quotesHtmlEncoded
</td>
<td>
@quotesHtmlEncoded
</td>
<td>
@Html.Raw(quotesHtmlEncoded)
</td>
<td>
@MvcHtmlString.Create(quotesHtmlEncoded)
</td>
</tr>
<tr>
<td>hebrew
</td>
<td>
@hebrew
</td>
<td>
@Html.Raw(hebrew)
</td>
<td>
@MvcHtmlString.Create(hebrew)
</td>
</tr>
<tr>
<td>hebrewHtmlEncoded
</td>
<td>
@hebrewHtmlEncoded
</td>
<td>
@Html.Raw(hebrewHtmlEncoded)
</td>
<td>
@MvcHtmlString.Create(hebrewHtmlEncoded)
</td>
</tr>
<tr>
<td>sampleXss
</td>
<td>
@sampleXss
</td>
<td>
@Html.Raw(sampleXss)
</td>
<td>
@MvcHtmlString.Create(sampleXss)
</td>
</tr>
<tr>
<td>sampleXssHtmlEncoded
</td>
<td>
@sampleXssHtmlEncoded
</td>
<td>
@Html.Raw(sampleXssHtmlEncoded)
</td>
<td>
@MvcHtmlString.Create(sampleXssHtmlEncoded)
</td>
</tr>
</tbody>
</table>
,