【问题标题】:Allow using some html tags in MVC 4允许在 MVC 4 中使用一些 html 标签
【发布时间】:2014-01-13 11:08:32
【问题描述】:

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

我的控制器:

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

    }
}

【问题讨论】:

  • 我没有得到你想要的,你能补充一些进一步的解释吗?
  • @Html.Raw 是否出错?
  • 不,我没有收到错误,但现在我的网站容易受到 XSS 攻击

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


【解决方案1】:

您可以将所有

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

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

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

    在绑定到视图之前

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

    【讨论】:

      【解决方案3】:

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

      第 1 步:

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

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

      第 2 步:

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

      【讨论】:

        【解决方案4】:

        您可能想查看 BBCode BBCode on Wikipedia。这样您就可以控制什么是允许的,什么是不允许的,并防止非法使用。

        这将像这样工作:

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

        【讨论】:

          【解决方案5】:

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

                      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\"/>");
          

          【讨论】:

            猜你喜欢
            • 2023-03-26
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-07-05
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多