如何确定字符串是否已在C#中以编程方式编码?
让我们举例如:
<p>test</p>
我想让我的逻辑理解它已被编码的这个值.. 有任何想法吗?感谢
答案 0 :(得分:47)
您可以使用HttpUtility.HtmlDecode()解码字符串,然后将结果与原始字符串进行比较。如果它们不同,原始字符串可能已被编码(至少,例程中发现了要解码的内容):
public bool IsHtmlEncoded(string text)
{
return (HttpUtility.HtmlDecode(text) != text);
}
答案 1 :(得分:7)
严格来说,这是不可能的。字符串包含的内容实际上可能是预期的文本,其编码版本为&lt;p&gt;test&lt;/p&gt;
。
您可以在字符串中查找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
<b< --> NeedsEncoding = False
" --> NeedsEncoding = False
以下是辅助方法,为了清楚起见,我将其分为两种方法。与Guffa says一样,制作防弹方法也存在风险和难度。
public static bool IsEncoded(string text)
{
// below fixes false positive <<>
// 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("<", "<")
答案 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));