2014-01-13 55 views
0

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

我的控制器:

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

    } 
} 
+1

你想要什么我不明白,你可以添加一些进一步的解释? – Anarion

+1

您是否在使用'@ Html.Raw'出错? – Satpal

+0

不,我没有收到错误,但现在我的网站容易受到XSS攻击 – eLTG

回答

1

您可以取代所有<字符为HTML实体:

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(标签)渲染页面

0

关闭验证为report_text(1)和编写定制HTML编码器(2):

步骤1:

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

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

第2步:

编写自定义HTML编码器(转换除B,I,IMG公司,例如,所有标签:脚本 - >; ltscript; GT),因为你定制请求验证的默认行为和html标签过滤。考虑到通过检查传递给存储过程/函数SQL参数从SQL注入攻击保护自己等

1

如果你想你的视图模型对象的某些属性接受HTML文本,使用AllowHtmlAttribute

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

和绑定到视图之前

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

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

这将这样的工作:

  1. 用户提交喜欢的东西“!会议现在将在[B]周一[/ B]”
  2. 之前将其保存到您的数据库中删除所有真正的html标签('< ...>'),以避免使用非法标签或代码注入,但保留伪标签原样。
  3. 查看时你只转换允许的伪HTML标记HTML真正
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\"/>"); 
相关问题