Как хранить комментарии в базе данных, чтобы эффективно отображать их на странице в виде HTML-текста? - PullRequest
1 голос
/ 03 июля 2011

У меня есть форма, где использование вводит несколько строк текста в текстовой области. Некоторые из строк также могут иметь HTML-разметки. Скажем, одна строка жирным шрифтом.

Как сохранить текст в моей базе данных? Должен ли я хранить их как это?

This is a greap post
<br/>
I love this type of findings.
<br/>
<br/>
Thanks for sharing

ИЛИ как это?

This is a greap post
&lt;br/&gt;
I love this type of findings.
&lt;br/&gt;
&lt;br/&gt;
Thanks for sharing

Во время редактирования: Я должен показать текст, как они были введены. Таким образом, разрыв строки будет заменен новой строкой Таким образом, использование видит разрыв строки. Textarea не поймет разметку br

Во время отображения: Я должен сделать так, чтобы текст на странице выглядел так:

This is a greap post

I love this type of findings.


Thanks for sharing

Я хочу знать, как лучше всего хранить текст, в котором может быть разметка.

Спасибо за помощь

Ответы [ 3 ]

2 голосов
/ 03 июля 2011

Поскольку вы хотите вывести HTML, вам нужно будет сохранить ввод в необработанном формате в базе данных. Хотя есть только один улов. Вы никогда не должны доверять вводу, поскольку весь ввод является злым, особенно в этом случае, поскольку вывод HTML непосредственно при вводе открывает возможность межсайтового скриптинга ( XSS ).

У вас есть два варианта:

  1. Используйте дезинфицирующее средство HTML, которое позволит вам удалить все теги, которые, как известно, не безопасны. Хорошее дезинфицирующее средство входит в комплект Microsoft AntiXss .

  2. Кодировать входные и декодировать части результата, которые, как известно, безопасны, например:

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 немного сложен, потому что это и дезинфицирующее средство, и кодер. Когда мы запускаем его до того, как он попадает в базу данных, он предотвращает изменение выходных данных при изменении списка безопасности. Это может быть как хорошо, так и плохо, но я бы сказал, что когда вы добавляете новые теги в безопасный список, вы не хотите, чтобы старые данные внезапно менялись. Поэтому в этом случае я бы использовал кодировку ввода вместо кодировки вывода.

Когда вы используете кодировку ввода, назовите столбец базы данных таким образом, чтобы было ясно, что мы имеем дело с обработанными, закодированными данными.

0 голосов
/ 03 июля 2011

сохранение его в вашей базе данных так:

<p>This is a greap post
<br/>
I love this type of findings.
<br/>
<br/>
Thanks for sharing</p>

будет работать ..

0 голосов
/ 03 июля 2011

Попробуйте htmlentities($str, ENT_QUOTES); перед сохранением данных и html_entity_decode($str) после того, как вы извлечете их из базы данных, прежде чем рендерить их в браузер.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...