【问题标题】:How to allow a user to enter html comments如何允许用户输入html评论
【发布时间】:2011-11-16 01:09:04
【问题描述】:

使用 MVC,EF 4.2。我正在开发一个有评论部分的应用程序。现在,如果用户输入包含 HTML 的评论,例如

<b>text</b>

然后点击提交我收到消息 “检测到一个潜在危险的 Request.Form 值...”

  1. 如何在进入数据库的过程中处理 html?我应该剥离html吗?还是编码?我尝试了 server.htmlencode 文本,但仍然有相同的错误消息。

我已经阅读了一些关于这个问题的帖子,包括 SO - this onethis one 的一些帖子

理想情况下,我希望能够允许有限数量的 html 标签,例如 em strong、a。 Anti-XSS、HTML Agility、某种 BB 代码或 Markdown 样式编辑器仍然是推荐的方式吗?我知道 Jeff 有一段代码的白名单——但它已经有几年的历史了。

【问题讨论】:

    标签: vb.net asp.net-mvc-3 model-view-controller html-encode


    【解决方案1】:

    你可以的

    [ValidateInput(false)]
    public ActionResult foo()
    {
    }
    

    或者你可以用AllowHtml装饰模型属性

       public class Foo
        {
            [AllowHtml]
            public string bar{ get; set; }
        }
    

    【讨论】:

    • 我也查看了这些属性,但它们不允许通过评论提交 XSS 和恶意代码的可能性吗?
    • 是的,这是权衡,如果您使用的是较旧的视图引擎(我忘记了名称),您可以编写 &lt;%:Html.TextBoxFor%&gt; 它将对值进行编码,或者如果您使用的是剃须刀 @ 语法它将编码html
    • 如果您担心 xss 和其他代码,请查看 Microsoft's Anti-XSS
    【解决方案2】:

    您可能还需要在 web.config 中设置 requestValidationMode:

    </system.web>
      <httpRuntime requestValidationMode="2.0" />
    </system.web>
    

    更多详情请见this link

    【讨论】:

      【解决方案3】:

      MVC 有一个属性,允许您指定一个属性,该属性应该允许 html 而不会完全禁用验证。它仍然很危险,但它可以限制在单个属性中,因此可以减轻风险。这是MSDN article for the AllowHtmlAttribute。属性的正确使用应该是在你的模型中装饰适当的属性:

      public class MyModel
      {
          public MyModel()
          {
      
          }
      
          // Some other stuff in here
      
          [AllowHtml]
          [HttpPost]
          public string MyHtmlString { get; set; }
      
      }
      

      【讨论】:

        【解决方案4】:

        我的允许 html incmets 的解决方案如下:

        1. 我的评论类中的 CommentText 属性上的 AllowHtml
        2. 允许标签的狭窄子集。使用 Html Sanitizer 类清理不允许通过白名单的 Html 和内联脚本
        3. 然后像往常一样将结果保存到数据库中
        4. 在输出时,使用 Html.Raw 在 cmets 中显示 Html

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-10-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多