【问题标题】:MVC 4 - Razor - "a potentially dangerous request.form value was detected from the client"MVC 4 - Razor - “从客户端检测到潜在危险的 request.form 值”
【发布时间】:2012-05-06 12:15:21
【问题描述】:

我的视图上有一个链接到外部站点的 i-Frame。该站点接受一些值和一些配置设置。作为这些配置设置的一部分是“CallBackURL”。此外部网站发布到此 CallBackUrl。

我将 CallBackURL 指定为对我的控件执行的操作。

查看代码

<form id="testForm" method="post" target="testFrame">
  <input type="hidden" name="RequestXML" ID="RequestXML" value="<Request><RedirectURL>Account/TokenRequest</RedirectURL></Request>"
</form>

<iframe id="testFrame" name="testFrame" frameborder="0" style="width:1000px;height:500px"></iframe>

控制器代码

  [HttpPost]
  [ValidateInput(false)]
  public ActionResult TokenRequest()
  {
    if (Request.Form["ResponseXML"] != null)
      ViewBag.ResponseXML = Request.Form["ResponseXML"];

    return PartialView();
  }

在我的控制器操作中,我收到以下错误:“从客户端检测到潜在危险的 request.form 值”

我也在 webconfig 中设置了这个

<httpRuntime requestValidationMode="2.0" />
<pages validateRequest="false"...

我做错了什么?

编辑 我正在编辑错误的 web.config 文件。我将它添加到视图文件夹内的 web.config 中。一旦我将其更改到正确的位置,它就开始工作了。

【问题讨论】:

  • 可能是antixsser 抓住了尖括号。尝试对 Request.Form 语句进行 Server.HTMLEncode。
  • 我试过了,还是不行。我仍然收到此错误:从客户端检测到潜在危险的 Request.Form 值(ResponseXML="

标签: iframe razor asp.net-mvc-4 form-post


【解决方案1】:

上述解决方案在 MVC4 中对我不起作用。对我有用的只是在动作上方放置一个属性。无需更改您的 web.config 或添加 AllowHtml 属性。

[HttpPost]
[ValidateInput(false)]
public ActionResult TokenRequest(TokenRequestModel model)
{
  if (!string.IsNullOrEmpty(model.ResponseXML))
  ViewBag.ResponseXML = model.ResponseXML;
  // ...

【讨论】:

  • 这对我有用,但我使用参数化 sql sprocs 将数据传递到数据库,所以我不担心 sql 注入等;但是,我想您只是想警告用户他们需要提供自己的验证实现...这与我的 Intranet 应用程序和有限的用户组无关。
【解决方案2】:

尝试使用模型而不是直接使用 html 控件。并使用 AllowHtml 属性。

型号:

public TokenRequestModel
{
   [AllowHtml]
   public string ResponseXML {get;set;}
}

行动:

[HttpPost]
public ActionResult TokenRequest(TokenRequestModel model)
{
  if (!string.IsNullOrEmpty(model.ResponseXML))
      ViewBag.ResponseXML = model.ResponseXML;

  return PartialView();
}

【讨论】:

  • 优雅的解决方案,在 MVC4 中工作。将 [AllowHtml] 添加到与视图中的 @Html.TextAreaFor() 匹配的 C# 属性。现在,在此字段中键入的所有 HTML 尖括号都可以正确加载和保存。
【解决方案3】:

你可以试试

  [HttpPost]
  public ActionResult TokenRequest()
  {
    if (Request.Unvalidated().Form["ResponseXML"] != null)
      ViewBag.ResponseXML = Request.Unvalidated().Form["ResponseXML"];

    return PartialView();
  }

我认为 Unvalidated() 将使错误消失而无需编辑 webconfig

【讨论】:

    【解决方案4】:

    我试过这个并为我工作:

    在提交表单时调用一个 javascript 函数,该函数将使用“encodeURIComponent”编码的值保存在隐藏字段中。

    然后在同一个函数中清除带有危险值的文本框的值。这样,表单将只提交编码值。

    <input type="submit" value="Save" class="btn btn-danger" onclick="encodeLabel1()" />
    
    <script>
    function encodeLabel1() {
                var label = $('#txt').val();
                $('#hfLabel1Encoded').val(encodeURIComponent(label));
                $('#txt').val('');
            }
     </script>
    

    这是一种解决方法,但它有效并且验证仍然有效。

    【讨论】:

      猜你喜欢
      • 2018-03-19
      • 2015-02-05
      • 1970-01-01
      • 2012-05-29
      • 2012-03-03
      相关资源
      最近更新 更多