最近セキュリティを学ぶ:)
ユーザーがフォームにテキストを入力して、いくつかの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><img src="http://metro-portal.hr/img/repository/2010/06/medium/hijena_shutter.jpg" /></p>
<p><
のため、最初にデコードする必要があると思います。
<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)または、この結果をエンコードしてデータベースに保存する必要があります(エンコードされたベロー)?
<p>Simple <em><strong>whitelist</strong> </em>test:</p>
<ul>
<li>t1</li>
<li>t2</li>
</ul>
<p>Image:</p>
<p>
ここで、次のようにビューに配置すると混乱します。
@Model.Data
私はこれをビューで取得します:
<p>Simple <em><strong>whitelist</strong> </em>test:</p> <ul> <li>t1</li> <li>t2</li> </ul> <p>Image:</p> <p>
または
<p>Simple <em><strong>whitelist</strong> </em>test:</p> <ul> <li>t1</li> <li>t2</li> </ul> <p>Image:</p> <p>
では、このHTMLを適切に表示するにはどうすればよいですか(太字、リストなど)?
経験則は次のとおりです。
そう:
_[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エンコードしますが、これは探しているものとは異なる場合があります。
フレームワーク4.5には、MVC 5を使用して、@ Html.Raw(WebUtility.HtmlDecode(item.ADITIONAL_INFORMAtION))を使用します。
Htmlcolumnのデータ型VARBINARY(MAX)を使用して、HTMLファイルをデータベースに保存できます。
HTMLファイルをバイナリファイルに変換します( コードプロジェクトリンク )
次のサンプルコードのように列にデータを挿入します。
Declare @HTML Varbinary(MAX) = Set HTML Varbinary code here
Insert into table_name (htmlcoulmn)
Value @HTML
- データベースにデータをロードします。ロードファイルが必要な場合は、次のコードでhtmlcolumnをNvarchar(max)に変換する必要があります。
Select CAST(htmlcolumn as nvarchar(MAX)) As HTMLCODE
FROM Table_Name
この解決策に問題がある場合は、コメントを書いてくれてありがとう。
がんばってください