2012-04-25 3 views
5

У меня есть i-Frame на моем представлении, который ссылается на внешний сайт. Этот сайт принимает некоторые значения и некоторые настройки конфигурации. Как часть этих настроек конфигурации, это «CallBackURL». Этот внешний сайт отправляется на этот CallBackUrl.MVC 4 - Razor - «потенциально опасное значение request.form было обнаружено у клиента»

Я указал, что CallBackURL является действием моего контроля.

View Code

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

Controller Код

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

Что я делаю неправильно?

EDIT Я редактировал неправильный файл web.config. Я добавлял его в web.config внутри папки представлений. Как только я сменил его на правильное место, он начал работать.

+0

Это, вероятно, antixsser ловя угловые скобки. Попробуйте Server.HTMLEncode заявление Request.Form. –

+0

Я пробовал, что это не работает. Я все еще получаю эту ошибку: потенциально опасное значение Request.Form было обнаружено у клиента (ResponseXML = «

ответ

2

Попробуйте использовать модель вместо простого управления html control. а также использовать атрибут 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(); 
} 
+1

это не работает на MVC 4 – Schneider

+0

Элегантное решение, работающее в MVC4. Добавлено свойство [AllowHtml] для свойства C#, которое соответствует представлению @ Html.TextAreaFor() в представлении. Все скобки HTML-скобки, введенные в это поле, теперь загружаются и сохраняются правильно. – SushiGuy

19

выше решение не работает для меня в MVC4. То, что работает для меня, - это только добавить атрибут выше действия. Не нужно менять свой web.config или добавлять атрибут AllowHtml.

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

Это сработало для меня, но я использую параметризованные sql sprocs для передачи данных в базу данных, поэтому я не беспокоюсь о SQL-инъекции и т. Д .; однако, я думаю, вы просто хотите предупредить пользователей о том, что им необходимо предоставить свою собственную проверку подлинности ... опять же не беспокоит мое приложение для интрасети и ограниченная группа пользователей. –

0

Вы можете попробовать

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

    return PartialView(); 
    } 

Я думаю, что непроверенные() сделает ошибку уйти без необходимости редактировать WebConfig