Как определить, была ли строка закодирована программно в С#?

Как определить, была ли программная кодировка строки в С#?

Позволяет, например, строку:

<p>test</p>

Я бы хотел, чтобы моя логика поняла, что это значение было закодировано. Есть идеи? Благодаря

Ответ 1

Вы можете использовать HttpUtility.HtmlDecode() для декодирования строки, а затем сравнить результат с исходной строкой. Если они разные, исходная строка, вероятно, была закодирована (по крайней мере, процедура обнаружила что-то для декодирования внутри):

public bool IsHtmlEncoded(string text)
{
    return (HttpUtility.HtmlDecode(text) != text);
}

Ответ 2

Строго говоря, это невозможно. То, что содержит строка, на самом деле может быть предназначенным текстом, а кодированная версия - <p>test</p>.

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

Ответ 3

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

private bool EncodeText(string val)
        {
            string decodedText = HttpUtility.HtmlDecode(val);
            string encodedText = HttpUtility.HtmlEncode(decodedText);

            return encodedText.Equals(val, StringComparison.OrdinalIgnoreCase);

        }

Ответ 4

Я использую метод NeedsEncoding() ниже для определения необходимости кодирования строки.

Results 
-----------------------------------------------------
b               -->      NeedsEncoding = True
<b>          -->      NeedsEncoding = True
<b>             -->      NeedsEncoding = True
&lt;b&lt;       -->      NeedsEncoding = False
&quot;          -->      NeedsEncoding = False

Вот вспомогательные методы, я разложил их на два метода для ясности. Как Guffa говорит, это рискованно и сложно создать пуленепробиваемый метод.

    public static bool IsEncoded(string text)
    {
        // below fixes false positive &lt;<> 
        // you could add a complete blacklist, 
        // but these are the ones that cause HTML injection issues
        if (text.Contains("<")) return false;
        if (text.Contains(">")) return false;
        if (text.Contains("\"")) return false;
        if (text.Contains("'")) return false;
        if (text.Contains("script")) return false;

        // if decoded string == original string, it is already encoded
        return (System.Web.HttpUtility.HtmlDecode(text) != text);
    }

    public static bool NeedsEncoding(string text)
    {
        return !IsEncoded(text);
    }

Ответ 5

Простым способом обнаружения этого будет проверка символов, которые не разрешены в закодированной строке, например, < и > .

Ответ 6

Все, что я могу предложить, это заменить известные кодированные разделы расшифрованной строкой.

replace("&lt;", "<")

Ответ 8

Я занимаюсь разработкой .NET Core 2.0, и я использую System.Net.WebUtility.HtmlDecode, но у меня есть ситуация, когда строки, обрабатываемые в микросервисе, могут иметь неопределенное количество кодировок, выполняемых на некоторых строках. Поэтому я собрал немного рекурсивного метода, чтобы справиться с этим:

    public string HtmlDecodeText(string value, int decodingCount = 0)
    {
        // If decoded text equals the original text, then we know decoding is done;
        // Don't go past 4 levels of decoding to prevent possible stack overflow,
        // and because we don't have a valid use case for that level of multi-decoding.

        if (decodingCount < 0)
        {
            decodingCount = 1;
        }

        if (decodingCount >= 4)
        {
            return value;
        }

        var decodedText = WebUtility.HtmlDecode(value);

        if (decodedText.Equals(value, StringComparison.OrdinalIgnoreCase))
        {
            return value;
        }

        return HtmlDecodeText(decodedText, ++decodingCount);
    }

И здесь я вызвал метод для каждого элемента в списке, где были закодированы строки:

  result.FavoritesData.folderMap.ToList().ForEach(x => x.Name = HtmlDecodeText(x.Name));