【问题标题】:ASP.NET MVC - A potentially dangerous Request.Form value was detected from the clientASP.NET MVC - 从客户端检测到潜在危险的 Request.Form 值
【发布时间】:2018-03-19 07:04:50
【问题描述】:

我正在尝试单击保存按钮以使用 ckeditor 更新我在文本编辑器中的内容,但出现此错误 从客户端检测到有潜在危险的 Request.Form 值(OPTION_VALUE="

Welcome to the Na...")。

控制器如下图

控制器

        public ActionResult EditRegistrationGuideline(long id)
    {
        OPTIONS options = _optionsService.GetOption(id);
        return View(options);
    }

    //
    // POST: /Product/Edit/5

    [HttpPost]
    public ActionResult EditRegistrationGuideline(long id, OPTIONS options)
    {
        try
        {
            // TODO: Add update logic here
            if (ModelState.IsValid)
            {
                options.OPTION_ID = id;
                options.ACTION_STATUS = 0;
                options.CREATED_DATE = DateTime.Now;
                _optionsService.AddOption(options);
                return RedirectToAction("Index");
            }
        }
        catch
        {
            //return View();
            ModelState.AddModelError("", "We cannot edit this Option. Verify your data entries !");
        }

        return View();
    }

风景在这里

查看

@{

//ViewBag.Title = "CreateRegistrationGuideline";

  }

<div class="content-header clearfix">
   <h1 class="pull-left">
    <i class="fa fa-plus"> </i> Edit Registration Guideline
   </h1>

<div class="col-xs-3 pull-right">
    <input type="button" class="btn btn-block btn-warning" value="Back" onclick="location.href='@Url.Action("IndexRegistrationGuideline", "Options")'" />
</div>


  <div class=" box box-body box-primary">
   @using (Html.BeginForm("EditRegistrationGuideline", "Options", FormMethod.Post, new { @class = "form-horizontal", @enctype = "multipart/form-data" }))
   {
    @Html.AntiForgeryToken()

    <div class="form-horizontal">
        @*<h4>OPTIONS</h4>
            <hr />*@
        @*@Html.ValidationSummary(true)*@
        @Html.ValidationSummary(false, null, new { @class = "text-danger" })
        <div class="row .col">
            <div style="margin-top:20px" class="mainbox col-md-12 col-md-offset-0 col-sm-8 col-sm-offset-2">
                <div class="panel panel-info">
                    <div class="panel-heading">
                        <div class="panel-title">Edit Option</div>
                    </div>
                    <div class="panel-body">
                        @*<div class="form-group">

                            @Html.LabelFor(model => model.OPTION_NAME, new { @class = "control-label col-md-2" })
                            <div class="col-md-10">*@

                        @*@Html.LabelFor(model => model.OPTION_NAME, new { @class = "control-label col-md-2" })
                            <div class="col-md-10">*@

                        @*@Html.EditorFor(model => model.OPTION_NAME)*@
                        @*@Html.HiddenFor(model => model.faculty_activation_date, new { @Value = System.DateTime.Now })*@
                        @Html.HiddenFor(model => model.OPTION_NAME)
                        @Html.ValidationMessageFor(model => model.OPTION_NAME)



                        <div class="form-group">
                            @*@Html.LabelFor(model => model.OPTION_VALUE, new { @class = "control-label col-md-2" })*@
                            <div class="col-md-10">
                                @Html.LabelFor(model => model.OPTION_VALUE, "Option Value")
                                @*<textarea class="form-control" placeholder="Enter Option Value" name="OPTION_VALUE" id="editor1"></textarea>*@
                                @Html.TextAreaFor(model => model.OPTION_VALUE, new { @class = "form-control", @id = "editor1" })
                                @Html.ValidationMessageFor(model => model.OPTION_VALUE, "", new { @class = "text-danger" })
                            </div>
                        </div>

                        @*<div>

                                @Html.LabelFor(model => model.OPTION_VALUE, "Option Value")
                                @Html.TextAreaFor(model => model.OPTION_VALUE, new { @type = "textarea", @id="editor1", @class = "form-control", @placeholder = "Enter Option Value", @autocomplete = "on" })
                                @Html.ValidationMessageFor(model => model.OPTION_VALUE, null, new { @class = "text-danger" })
                            </div>*@

                        @*<div class="form-group">
                                @Html.LabelFor(model => model.ACTION_STATUS, new { @class = "control-label col-md-2" })
                                <div class="col-md-10">
                                    @Html.EditorFor(model => model.ACTION_STATUS)
                                    @Html.ValidationMessageFor(model => model.ACTION_STATUS)
                                </div>
                            </div>*@

                    </div>

                    <div class="panel-footer">
                        <div class="panel-title">
                            <div class="form-actions no-color">
                                <input type="submit" value="Save" class="btn btn-success" />
                            </div>
                        </div>
                    </div>
                </div>

            </div>
        </div>
    </div>

}

@*<div>
        @Html.ActionLink("Back to List", "Index")
    </div>*@

@section Scripts {
@Scripts.Render("~/bundles/jqueryval")
<script src="~/Scripts/jquery-3.1.1.min.js"></script>
<script src="~/Scripts/jquery.validate.min.js"></script>
<script src="~/Scripts/jquery.validate.unobtrusive.min.js"></script>
<script src="https://cdn.ckeditor.com/4.5.7/standard/ckeditor.js"></script>
<script>
    $(function () {

        CKEDITOR.replace('editor1');
    });
</script>
}

请问我该怎么办。

我使用 CKEDITOR

【问题讨论】:

  • [AllowHtml] 属性添加到您的OPTION_VALUE 属性。

标签: asp.net-mvc


【解决方案1】:

只需将ValidateInput(false) 属性放在控制器的操作上。

[HttpPost]
[ValidateInput(false)]
public ActionResult EditRegistrationGuideline(long id, OPTIONS options)

另一种选择是在模型属性上放置 [AllowHtml] 属性,查看 SO 帖子以了解它们之间的区别

ValidateInput(false) vs AllowHtml

【讨论】:

  • 尝试在你的根 web.config 中添加 http 请求验证
【解决方案2】:

XSS 错误(“从客户端检测到潜在危险的 Request.Form 值(...)”)。 解决方案:

[ValidateInput(false)]

两者的区别

AllowHtml

AllowHtml 属性可以应用于 Model 属性,它将禁用 ASP.Net MVC 仅对该特定属性的验证

优势 AllowHtml 属性是为 Model 类开发的。 Scope 仅限于 Model 类的特定属性。 这是安全且推荐的解决方案。

验证输入

ValidateInput 属性可以应用于控制器的 Action 方法,它将禁用 ASP.Net MVC 仅对该特定 Action 方法的验证。

优势

Scope 仅限于 Controller 类的特定 Action 方法。 如果您有多个属性接受 HTML 内容,那么此方法将减少冗余。 当模型类不用于设计表单元素时,则需要此属性。完整详细信息Link

【讨论】:

    【解决方案3】:

    我遇到了与以下错误消息A potentially dangerous Request.Form value was detected from the client 类似的问题。

    作为先前答案的替代方案,我发现对传递回控制器的值进行编码是有效的。 CKEditor 允许您通过设置配置 config.htmlEncodeOutput = true; 来做到这一点。

    可以在以下位置找到相关文档:https://docs-old.ckeditor.com/ckeditor_api/symbols/CKEDITOR.config.html#.htmlEncodeOutput

    【讨论】:

      【解决方案4】:

      我在我的网站上测试 XSS 时遇到此错误。 这是 model 提供给我们的一个非常好的功能,可以防止 XSSCSRF 渗透到您的网站。 尽量不要禁用它。

      【讨论】:

      • 这并不能真正回答问题。如果您有其他问题,可以点击 提问。要在此问题有新答案时收到通知,您可以follow this question。一旦你有足够的reputation,你也可以add a bounty 来引起对这个问题的更多关注。 - From Review
      猜你喜欢
      • 1970-01-01
      • 2015-02-05
      • 2014-02-11
      • 1970-01-01
      • 2012-05-29
      相关资源
      最近更新 更多