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