Iframe MVC 4-剃须刀;从客户端检测到潜在危险的request.form值;

Iframe MVC 4-剃须刀;从客户端检测到潜在危险的request.form值;,iframe,razor,asp.net-mvc-4,form-post,Iframe,Razor,Asp.net Mvc 4,Form Post,我的视图上有一个I-Frame链接到一个外部站点。此站点接受一些值和一些配置设置。作为这些配置设置的一部分,“回调URL”。此外部网站发布到此回调URL 我将CallBackURL指定为控件上的操作 视图代码 <form id="testForm" method="post" target="testFrame"> <input type="hidden" name="RequestXML" ID="RequestXML" value="<Request><

我的视图上有一个I-Frame链接到一个外部站点。此站点接受一些值和一些配置设置。作为这些配置设置的一部分,“回调URL”。此外部网站发布到此回调URL

我将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>
在控制器操作中,我收到以下错误:“从客户端检测到一个潜在危险的request.form值”

我也在网络配置中设置了这个

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


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

型号:

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中对我不起作用。对我来说,唯一有效的方法就是将属性置于动作之上。无需更改web.config或添加AllowHtml属性

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

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

    return PartialView();
  }

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

<httpRuntime requestValidationMode="2.0" />
<pages validateRequest="false"...
表单提交时调用一个javascript函数,该函数将使用“encodeURIComponent”编码的值保存在hiddenfield中

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

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

函数encodeLabel1(){
var label=$('#txt').val();
$('hfLabel1Encoded').val(encodeURIComponent(label));
$('#txt').val('');
}

这是一个解决办法,但它可以工作,验证仍处于活动状态。

可能是防X装置抓住了尖括号。尝试对Request.Form语句进行Server.HTMLEncode编码。我尝试过了,它不起作用。我仍然收到此错误:从客户端(ResponseXML)检测到一个潜在危险的请求。表单值="这对我来说是可行的,但我使用参数化sql存储过程将数据传递到数据库,因此我不担心sql注入等问题;不过,我想您只想警告用户,他们需要提供自己的验证实现……同样,我的intranet应用程序和有限的用户组不需要担心。优雅的解决方案,有效在MVC4中,将[AllowHtml]添加到与视图中的@Html.TextAreaFor()匹配的C#属性中。现在,所有键入到此字段的Html尖括号都将正确加载和保存。