web-dev-qa-db-fra.com

Comment enregistrer du HTML dans la base de données et le récupérer correctement

Apprendre la sécurité de nos jours :)
Je dois autoriser les utilisateurs à saisir du texte dans un formulaire et leur autoriser certaines balises HTML: gras, italique, liste, etc. et les empêcher d'ajouter du code JavaScript dangereux.
J'ai donc utilisé cette implémentation de liste blanche pour assainir le HTML.
Mais je ne sais toujours pas comment l'enregistrer et l'afficher correctement.
Alors voici ce que j'ai fait:
Modèle:

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

Manette:

[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);

Vue:

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

Ainsi, lorsque je poste un formulaire, je vois:

<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>

Becaouse de <p>&lt; Je pense que je dois d'abord le décoder:

<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>

Ensuite, je le désinfecte par rapport à la liste blanche et j'obtiens du HTML désinfecté:

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

1) Dois-je l'enregistrer comme ceci dans la base de données?
2) Ou dois-je encoder ce résultat puis l'enregistrer dans la base de données (ci-dessous encodé)?

&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;

Ici, je suis confus si je le mets sur la vue comme ceci:

@Model.Data

Je reçois ceci sur la vue:

&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;

ou

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

Alors, que faire pour afficher correctement ce code HTML (gras, liste, etc.)?

16
1110

La règle d'or est la suivante:

  1. Stockez dans votre base de données le HTML brut sans aucun encodage ou désinfection. Un serveur SQL ne se soucie pas si vous stockez une chaîne contenant du code XSS.
  2. Lorsque vous affichez cette sortie sur votre page, assurez-vous qu'elle est nettoyée.

Alors:

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

puis lors de l'affichage:

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

Remarquez comment j'ai utilisé l'assistant Html.Raw ici pour vous assurer que vous n'obtenez pas de sortie codée en HTML double. La fonction HtmlUtility.SanitizeHtml Devrait déjà prendre soin de nettoyer la valeur et renvoyer une chaîne sûre que vous pourriez afficher dans votre vue et elle ne sera plus encodée. Si d'autre part vous avez utilisé @HtmlUtility.SanitizeHtml(Model.Data), alors la fonction de rasoir @ Coderait en HTML le résultat de la fonction SanitizeHtml qui pourrait ne pas être ce que vous recherchez.

24
Darin Dimitrov

Pour l'infrastructure 4.5, à l'aide de MVC 5, utilisez @ Html.Raw (WebUtility.HtmlDecode (item.ADITIONAL_INFORMAtION))

2
Alexander Barrios

Vous pouvez enregistrer un fichier HTML dans la base de données par type de données VARBINARY (MAX) pour htmlcolumn.

  1. Convertir un fichier html en fichier binaire ( lien du projet de code )

  2. insérer des données dans une colonne comme cet exemple de code:

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

Insert into table_name (htmlcoulmn)
Value @HTML
  1. Charger des données sur la base de données, lorsque vous avez besoin de charger un fichier, vous devez convertir htmlcolumn en Nvarchar (max) par ce code:
Select CAST(htmlcolumn as nvarchar(MAX)) As HTMLCODE
FROM Table_Name

Si cette solution a un problème, merci de m'écrire un commentaire.

Je vous souhaite le meilleur

1
Amirhossein