Arhn - архитектура программирования

Проблема с атрибутом MVC3 AllowHtml

У меня есть веб-приложение на основе MVC3 (без бета-версии или кандидата на выпуск, версия RTM/RTW), в котором есть действие, которое принимает XML-файлы для обработки.

Конечно, для MVC это кажется злом из-за возможных атак, поэтому он этого не допускает. Ну, я пытаюсь поставить либо AllowHtml на объект модели как таковой:

   public class XMLModel
    {
        [AllowHtml]
        public string msg { get; set; }
    }

Или я устанавливаю для ValidateInput значение false в моем методе действия, например:

    [ValidateInput(false)]
    public ActionResult AddCDR(XMLModel model)
    {
    }

Причина наличия «строгой» типизированной модели в первую очередь заключалась в том, что я изначально пытался использовать строковое значение с именем «msg» в качестве параметра метода действия, но это всегда возвращалось пустым.

Теперь, когда кто-то отправляет сообщение в эту форму на том же компьютере или с компьютера в сети, поле сообщения всегда остается пустым.

Я проверил с помощью WireShark, что данные действительно находятся в запросе.

Теперь одна интересная вещь. В MVC 3 в этом нет необходимости. Тем не менее, это имеет небольшое значение.

Если я добавлю это в свою веб-конфигурацию:

<httpRuntime requestValidationMode="2.0" />

Он работает для запросов, исходящих с локального компьютера, но НЕ работает из другой системы.

Я думаю, что версия AllowHtml кажется элегантной — если бы она работала.

Я также узнал об ошибке в RC2 - опять же, это не должно касаться меня, но я все равно попытался добавить следующее в Application_Start():

ModelMetadataProviders.Current = new DataAnnotationsModelMetadataProvider();

Как и ожидалось, особой разницы нет.

На моем компьютере для разработки (Win7x64, VS2010) все работает, как и ожидалось, но в целевой системе (Win2008R2x64, IIS7.5) вышеуказанные проблемы доставляют мне неприятности.

Очень важное замечание: если я публикую действие без угловых скобок, я получаю данные формы, как и ожидалось. Однако, как только появляются угловые скобки, либо мое действие вообще не вызывается, либо оно не находит данные формы ни в параметрах метода действия, ни, например, в Request.Params["msg"], где оно должно быть.

Любые идеи, чтобы разрешить XML через?

ОБНОВЛЕНИЕ

Я пытался обойти это, ожидая, пока кто-нибудь ответит здесь. Я еще не смог ее решить, но проверил несколько дополнительных деталей;

  • Во-первых, я убедился, что версия ASP.NET MVC 3, установленная как на моем компьютере для разработки, так и на веб-сервере, одинакова; v3.0.20105.0 (согласно установке и удалению программ).
  • The web application was actually created with the MVC3 beta, then converted to RC1 and RC2 as they came out, and finally to the RTM version. This meant I had to modify some code because of the ViewBag change. However, since I didn't know exactly what else had changed, I created a brand new MVC3 application with the RTM version, created a controller by the same name, with the same action method, taking a model object similar to the currently used one, renamed the old web app directory and put this new one in place. Exactly the same thing happens - i.e. the parameter with the AllowHtml attribute comes through with all content when the request is made from the local machine, but if it comes from a remote machine, then the HTML (XML actually) is stripped out.
    • There is no exception. I've installed Elmah and verified this - no exception occurs, my action method is apparently just called with anything looking like XML stripped out from the parameters to the method.

Излишне говорить, что это сводит меня с ума. Вчера мне посоветовали посмотреть исходный код MVC3, но, к сожалению, это мне не очень помогает, так как я не вижу там ничего явно неправильного и не могу отлаживать код на рассматриваемом сервере.

Любые идеи все еще очень желательны, спасибо! :)

27.01.2011

Ответы:


1

Я не могу воспроизвести это.

Модель:

using System.Web.Mvc;

namespace MvcApplication3.Models {
    public class XmlModel {
        [AllowHtml]
        public string msg { get; set; }
    }
}

Контроллер:

using System.Web.Mvc;
using MvcApplication3.Models;

namespace MvcApplication3.Controllers {
    public class HomeController : Controller {
        public ActionResult Index() {
            return View();
        }

        [HttpPost]
        public ActionResult Index(XmlModel model) {
            return View();
        }
    }
}

Вид:

@model MvcApplication3.Models.XmlModel

@using (Html.BeginForm()) {
    <div class="editor-label">
        @Html.LabelFor(model => model.msg)
    </div>
    <div class="editor-field">
        @Html.EditorFor(model => model.msg)
        @Html.ValidationMessageFor(model => model.msg)
    </div>
}

Они были добавлены в пустой проект MVC 3 по умолчанию. Все нормально публикуется. Когда я удаляю [AllowHtml], он генерирует соответствующее сообщение об ошибке.

31.01.2011
  • Спасибо, Брэд, очень приятно! Я добился некоторого прогресса в этом сам и, надеюсь, подтвержу решение сегодня. 01.02.2011

  • 2

    Я отвечаю на это сам, потому что это была неясная ситуация, и MVC3 не был проблемой.

    Система, которая отправляла данные в мое приложение, делала это с искаженными данными. В дополнение к этому мне сказали, что они также отправляли POST в более старое приложение MVC2, которое работало нормально — это было неправильно, оказалось, что в этом случае они GETting, и GET они делают правильно.

    Во всяком случае, довольно тщательное тестирование подтвердило, что атрибут AllowHtml действительно работает очень хорошо. Никогда не доверяй своему вкладу, т. :)

    02.02.2011
    Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..