如何确定字符串是否已在C#中以编程方式编码?

时间:2010-12-22 09:50:19

标签: c# asp.net

如何确定字符串是否已在C#中以编程方式编码?

让我们举例如:

<p>test</p>

我想让我的逻辑理解它已被编码的这个值.. 有任何想法吗?感谢

8 个答案:

答案 0 :(得分:47)

您可以使用HttpUtility.HtmlDecode()解码字符串,然后将结果与原始字符串进行比较。如果它们不同,原始字符串可能已被编码(至少,例程中发现了要解码的内容):

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

答案 1 :(得分:7)

严格来说,这是不可能的。字符串包含的内容实际上可能是预期的文本,其编码版本为<p>test</p>

您可以在字符串中查找HTML实体,并对其进行解码,直到没有剩下,但以这种方式解码数据会有风险,因为它假设可能不是真的。

答案 2 :(得分:3)

这是我对它的看法......如果用户传入部分编码的文本,这将会抓住它。

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

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

        }

答案 3 :(得分:1)

我使用下面的NeedsEncoding()方法来确定字符串是否需要编码。

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

以下是辅助方法,为了清楚起见,我将其分为两种方法。与Guffa says一样,制作防弹方法也存在风险和难度。

    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);
    }

答案 4 :(得分:0)

检测这种情况的一种简单方法是检查编码字符串中不允许的字符,例如&lt;和&gt;。

答案 5 :(得分:0)

我所能建议的是用已解码的字符串替换已知的编码部分。

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

答案 6 :(得分:0)

试试这个答案:Determine a string's encoding in C#

另一个代码项目可能会有所帮助.. http://www.codeproject.com/KB/recipes/DetectEncoding.aspx

您还可以使用正则表达式匹配字符串内容......

答案 7 :(得分:0)

我正在进行.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));