Как определить, была ли строка закодирована программно в С#?
Как определить, была ли программная кодировка строки в С#?
Позволяет, например, строку:
<p>test</p>
Я бы хотел, чтобы моя логика поняла, что это значение было закодировано.
Есть идеи? Благодаря
Ответы
Ответ 1
Вы можете использовать HttpUtility.HtmlDecode() для декодирования строки, а затем сравнить результат с исходной строкой. Если они разные, исходная строка, вероятно, была закодирована (по крайней мере, процедура обнаружила что-то для декодирования внутри):
public bool IsHtmlEncoded(string text)
{
return (HttpUtility.HtmlDecode(text) != text);
}
Ответ 2
Строго говоря, это невозможно. То, что содержит строка, на самом деле может быть предназначенным текстом, а кодированная версия - &lt;p&gt;test&lt;/p&gt;
.
Вы можете искать 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
<b< --> NeedsEncoding = False
" --> NeedsEncoding = False
Вот вспомогательные методы, я разложил их на два метода для ясности. Как Guffa говорит, это рискованно и сложно создать пуленепробиваемый метод.
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);
}
Ответ 5
Простым способом обнаружения этого будет проверка символов, которые не разрешены в закодированной строке, например, < и > .
Ответ 6
Все, что я могу предложить, это заменить известные кодированные разделы расшифрованной строкой.
replace("<", "<")
Ответ 7
Попробуйте этот ответ: Определите кодировку строки на С#
Другой проект кода может помочь.
http://www.codeproject.com/KB/recipes/DetectEncoding.aspx
Вы также можете использовать регулярное выражение для соответствия содержимому строки...
Ответ 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));