Поскольку вы хотите вывести HTML, вам нужно будет сохранить ввод в необработанном формате в базе данных. Хотя есть только один улов. Вы никогда не должны доверять вводу, поскольку весь ввод является злым, особенно в этом случае, поскольку вывод HTML непосредственно при вводе открывает возможность межсайтового скриптинга ( XSS ).
У вас есть два варианта:
Используйте дезинфицирующее средство HTML, которое позволит вам удалить все теги, которые, как известно, не безопасны. Хорошее дезинфицирующее средство входит в комплект Microsoft AntiXss .
Кодировать входные и декодировать части результата, которые, как известно, безопасны, например:
string[] safeList = { "<br/>", "<b>", "</b>", "<i>", "</i>" };
public static string EncodeInputWithSafeList(string unsafeInput)
{
// First: encode the complete input.
string safeInput = Encoder.HtmlEncode(unsafeInput);
// Next: decode each tag that is known to be safe.
foreach (string safeTag in safeList)
{
string encodedTag = Encoder.HtmlEncode(safeTag, false);
safeInput = safeInput.Replace(encodedTag, safeTag);
}
return safeInput;
}
Примечание. В этом примере используется класс Encoder
из набора инструментов Microsoft AntiXss .
Теперь возникает вопрос, в какой момент мы должны его очистить. Обычно вы должны кодировать выходные данные непосредственно перед отправкой их клиенту, а не хранить их в базе данных, поскольку они зависят от типа вывода (HTML, PDF, JSON) от способа кодирования данных. Это подтверждается тем фактом, что в случае ошибки в кодировщике невозможно исправить ее, поскольку данные уже закодированы.
В этом случае все немного сложнее, поскольку вводом является HTML, а не просто текст. Я бы сказал, что очистка - это то, что вы все еще хотели бы сделать заранее, потому что таким образом вы предотвращаете неправильный ввод данных в вашу базу данных. Метод EncodeInputWithSafeList
немного сложен, потому что это и дезинфицирующее средство, и кодер. Когда мы запускаем его до того, как он попадает в базу данных, он предотвращает изменение выходных данных при изменении списка безопасности. Это может быть как хорошо, так и плохо, но я бы сказал, что когда вы добавляете новые теги в безопасный список, вы не хотите, чтобы старые данные внезапно менялись. Поэтому в этом случае я бы использовал кодировку ввода вместо кодировки вывода.
Когда вы используете кодировку ввода, назовите столбец базы данных таким образом, чтобы было ясно, что мы имеем дело с обработанными, закодированными данными.