允许在MVC 4中使用一些html标签

时间:2014-01-13 11:08:32

标签: html .net asp.net-mvc asp.net-mvc-4

我如何允许客户端在MVC 4中使用html标签? 我想将记录保存到数据库中,当它在视图中提取时只允许一些HTML标记(< b>< i>< img>),其他标记必须表示为文本。

我的控制器:

    [ValidateInput(false)]
    [HttpPost]
    public ActionResult Rep(String a)
    {
            var dbreader = new DataBaseReader();
            var text = Request["report_text"];
            dbreader.SendReport(text, uid, secret).ToString();
           ...
    }

我的观点:

@{
    var dbreader = new DataBaseReader();
    var reports = dbreader.GetReports();
    foreach (var report in reports)
    {

           <div class="report_content">@Html.Raw(report.content)</div>
           ...

    }
}

5 个答案:

答案 0 :(得分:1)

如果您正在尝试视图模型对象的某些属性来接受Html文本,请使用AllowHtmlAttribute

[AllowHtml]
public string UserComment{ get; set; }

并在绑定到视图之前

model.UserComment=model.UserComment.Replace("<othertagstart/end>",""); //hard

答案 1 :(得分:1)

您可以替换所有&lt; chars to HTML entity:

tags = tags.Replace("<", "&lt;");

现在,只替换回允许的标签:

tags = tags
    .Replace("&lt;b>", "<b>")
    .Replace("&lt;/b>", "</b>")
    .Replace("&lt;i>", "</i>")
    .Replace("&lt;/i>", "</i>")
    .Replace("&lt;img ", "<img ");

使用 @ Html.Raw(tags)

渲染到页面

答案 2 :(得分:0)

关闭report_text(1)的验证并编写自定义HTML编码器(2):

第1步:

Request.Unvalidated().Form["report_text"]

更多信息here。您无需关闭整个控制器操作的验证。

第2步:

编写自定义html编码器(将除b,i,img之外的所有标签转换为例如:script - &gt ;; ltscript; gt),因为您要自定义请求验证和html标记过滤的默认行为。考虑通过检查传递给存储过程/函数等的SQL参数来保护自己免受SQL注入攻击。

答案 3 :(得分:0)

您可能需要查看BBCode BBCode on Wikipedia。通过这种方式,您可以控制允许的内容和不允许的内容,并防止非法使用。

这可以这样工作:

  1. 用户提交类似'会议现在将在[b]星期一![/ b]'
  2. 在将其保存到您的数据库之前,您删除所有真正的html标记('&lt; ...&gt;')以避免使用非法标记或代码注入,但保留伪标记。
  3. 查看时,只将允许的伪html标签转换为真实的html

答案 4 :(得分:0)

我找到了问题的解决方案:

            html = Regex.Replace(html, "&lt;b&gt;(.*?)&lt;/&gt;", "<b>$1</b>");
            html = Regex.Replace(html, "&lt;i&gt;(.*?)&lt;/i&gt;", "<i>$1</i>");
            html = Regex.Replace(html, "&lt;img(?:.*?)src=&quot;(.*?)&quot;(?:.*?)/&gt;", "<img src=\"$1\"/>");