Как сохранить HTML в базу данных и получить его правильно

Обучение безопасности в эти дни:)
Мне нужно разрешить пользователям вводить текст в форме и разрешать им некоторые теги HTML: полужирный, курсив, список и т. Д., А также запрещать им добавлять опасный код JavaScript.
Поэтому я использовал эту реализацию белого списка для очистки HTML.
Но я все еще не понимаю, как сохранить и правильно отобразить его.
Итак, вот что я сделал:
Модель:

public class Post
    {
        [AllowHtml]
        public string Data { get; set; }
    }

контроллер:

[HttpPost, ActionName("Create")]
        [ValidateAntiForgeryToken]
        public ActionResult Create(Post model)
        {
            // Decode model.Data as it is Encoded after post
            string decodedString = HttpUtility.HtmlDecode(model.Data);
            // Clean HTML
            string sanitizedHtmlText =  HtmlUtility.SanitizeHtml(decodedString);

            string encoded = HttpUtility.HtmlEncode(sanitizedHtmlText);

Посмотреть:

@using (Html.BeginForm("Create", "Home", FormMethod.Post)) {    
    @Html.AntiForgeryToken()
    @Html.TextAreaFor(a=>a.Data)
    <input type="submit" value="submit" />
}

Поэтому, когда я публикую форму, я вижу:

<p>Simple <em><strong>whitelist</strong> </em>test:</p>
<ul>
<li>t1</li>
<li>t2</li>
</ul>
<p>Image:</p>
<p>&lt;img src="http://metro-portal.hr/img/repository/2010/06/medium/hijena_shutter.jpg" /&gt;</p>

Стало <p>&lt; Я думаю, что мне нужно сначала расшифровать его:

<p>Simple <em><strong>whitelist</strong> </em>test:</p>
<ul>
<li>t1</li>
<li>t2</li>
</ul>
<p>Image:</p>
<p><img src="http://metro-portal.hr/img/repository/2010/06/medium/hijena_shutter.jpg" /></p>

Затем я очищаю его от белого списка и получаю очищенный HTML:

<p>Simple <em><strong>whitelist</strong> </em>test:</p>
<ul>
<li>t1</li>
<li>t2</li>
</ul>
<p>Image:</p>
<p>

1) Должен ли я сохранить это в базе данных?
2) Или мне нужно закодировать этот результат и затем сохранить его в базе данных (закодировано ниже)?

&lt;p&gt;Simple &lt;em&gt;&lt;strong&gt;whitelist&lt;/strong&gt; &lt;/em&gt;test:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;t1&lt;/li&gt;
&lt;li&gt;t2&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Image:&lt;/p&gt;
&lt;p&gt;

Здесь я запутался, если бы поставил это на вид так:

@Model.Data

Я получаю это на виду:

&lt;p&gt;Simple &lt;em&gt;&lt;strong&gt;whitelist&lt;/strong&gt; &lt;/em&gt;test:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;t1&lt;/li&gt; &lt;li&gt;t2&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;Image:&lt;/p&gt; &lt;p&gt;

или же

<p>Simple <em><strong>whitelist</strong> </em>test:</p> <ul> <li>t1</li> <li>t2</li> </ul> <p>Image:</p> <p>

Так что же делать, чтобы правильно отобразить этот HTML-код (жирный шрифт, список и т. Д.)?

2 ответа

Решение

Практическое правило следующее:

  1. Храните в своей базе данных RAW HTML без каких-либо кодировок или дезинфекций. Серверу SQL не важно, храните ли вы какую-либо строку, содержащую код XSS.
  2. При отображении этого вывода на странице убедитесь, что он очищен.

Так:

[HttpPost, ActionName("Create")]
[ValidateAntiForgeryToken]
public ActionResult Create(Post model)
{
    // store model.Data directly in your database without any cleaning or sanitizing
}

а затем при отображении:

@Html.Raw(HtmlUtility.SanitizeHtml(Model.Data))

Обратите внимание, как я использовал здесь помощник Html.Raw, чтобы гарантировать, что вы не получите двойной HTML-кодированный вывод. HtmlUtility.SanitizeHtml Функция уже должна позаботиться о санации значения и вернуть безопасную строку, которую вы могли бы отобразить в своем представлении, и она не будет в дальнейшем кодироваться. Если с другой стороны вы использовали @HtmlUtility.SanitizeHtml(Model.Data)тогда @ Функция бритвы будет HTML кодировать результат SanitizeHtml функция, которая может быть не то, что вы ищете.

Для каркаса 4.5, используя MVC 5, используйте @Html.Raw(WebUtility.HtmlDecode(item.ADITIONAL_INFORMAtION))

Вы можете сохранить файл HTML в базе данных по типу данных VARBINARY(MAX) для столбца html.

  1. Преобразование html-файла в двоичный файл (ссылка на проект кода)

  2. вставьте данные в столбец, как в этом примере кода:

Declare @HTML   Varbinary(MAX) = Set HTML Varbinary code here 

Insert into table_name (htmlcoulmn)
Value @HTML
  1. Загрузите данные в базу данных, когда вам нужен файл загрузки, вы должны преобразовать htmlcolumn в Nvarchar(max) с помощью этого кода:
Select CAST(htmlcolumn as nvarchar(MAX)) As HTMLCODE
FROM Table_Name

Если у этого решения есть проблема, спасибо, что написали мне комментарий.

Я надеюсь ты на лучшее

Другие вопросы по тегам