Как я могу ввести кавычки в "белый список" на 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("&quot;", "\"").Replace("&#39;", "'");

10x;)

Хорошо, если вы получите &#039; &quot; на 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>

пример выходного изображения

, doubleEncodedHtml

Другие вопросы по тегам