web-dev-qa-db-ja.com

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を適切に表示するにはどうすればよいですか(太字、リストなど)?

16
1110

経験則は次のとおりです。

  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)を使用した場合、_@_かみそり関数はSanitizeHtml関数の結果をHTMLエンコードしますが、これは探しているものとは異なる場合があります。

24
Darin Dimitrov

フレームワーク4.5には、MVC 5を使用して、@ Html.Raw(WebUtility.HtmlDecode(item.ADITIONAL_INFORMAtION))を使用します。

2

Htmlcolumnのデータ型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

この解決策に問題がある場合は、コメントを書いてくれてありがとう。

がんばってください

1
Amirhossein