关于asp.net:How判断字符串是否已在C#中以编程方式编码?

How determine if a string has been encoded programmatically in C#?

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

例如字符串:

1
<p>test</p>

我想让我的逻辑理解这个值已经被编码了。有什么想法吗?谢谢


可以使用httputility.htmldecode()对字符串进行解码,然后将结果与原始字符串进行比较。如果它们不同,则原始字符串可能被编码(至少,该例程在内部找到了要解码的内容):

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


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

您可以在字符串中查找HTML实体,并对其进行解码,直到没有剩余的HTML实体为止,但是这样解码数据是有风险的,因为它假定事情可能不是真的。


这是我的看法…如果用户传入部分编码的文本,这将捕获它。

1
2
3
4
5
6
7
8
private bool EncodeText(string val)
        {
            string decodedText = HttpUtility.HtmlDecode(val);
            string encodedText = HttpUtility.HtmlEncode(decodedText);

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

        }

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

1
2
3
4
5
6
7
Results
-----------------------------------------------------
b               -->      NeedsEncoding = True
<b>          -->      NeedsEncoding = True
             -->      NeedsEncoding = True
<b<       -->      NeedsEncoding = False
"          -->      NeedsEncoding = False

下面是帮助器方法,为了清晰起见,我将它分为两种方法。就像Guffa说的那样,生产防弹方法既危险又困难。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    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);
    }

我正在开发.NET Core 2.0,我正在使用System.NET.WebUtility.htmldecode,但我遇到这样的情况:在微服务中处理的字符串可能对某些字符串执行了不确定数量的编码。所以我用一个递归的方法来处理这个问题:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
    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);
    }

在这里,我对列表中的每个项调用了方法,其中对字符串进行了编码:

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

尝试此答案:确定字符串的C编码#

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

您也可以使用regex来匹配字符串内容…


我只能建议您用解码后的字符串替换已知的编码部分。

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

检测这一点的一个简单方法是检查编码字符串中不允许使用的字符,例如<和>。