Mvc 3 - Контроллер как обработчик изображений, как пройти путь? - PullRequest
0 голосов
/ 26 июля 2011

Я пытаюсь использовать контроллер в качестве обработчика изображений, но как мне передать путь к нему?

Сейчас это выглядит так (работает для изображений без пути):

public void GetImage(string parameter)
{
    var imageHandler = UnityGlobalContainer.Container.Resolve<IImageHandler>();
    imageHandler.ProcessRequest(parameter);
}

Но если я попытаюсь отправить в папку path1 \ folder2 \ folder3 \ picture.jpg, то произойдет сбой.

@Html.ActionLink("Show", "GetImage", "Utility", new { parameter = @"folder1\folder2\folder3\picture.jpg" }, new { })

выдаст это: http://localhost:58359/Utility/GetImage/folder1%5Cfolder2%5Cfolder3%5Cpicture.jpg

ичто приводит к: HTTP Ошибка 400 - Неверный запрос.

Как я могу передать путь к контроллеру, используя обычный подход mvc?(Я использую обратную косую черту, а не прямую). Я также протестировал использование параметра HttpUtility.UrlEncode.

Ответы [ 4 ]

2 голосов
/ 26 июля 2011

Согласно вашему коду: созданная ссылка на html-странице должна быть: http://localhost:58359/Utility/GetImage?parameter=folder1%5Cfolder2%5Cfolder3%5Cpicture.jpg, а переменная параметра должна быть правильно установлена ​​в "folder1 \ folder2 \ folder3 \ picture.jpg" в методе действия.1003 *

Обратите внимание, что вы можете быть уязвимы для обхода каталога здесь.

0 голосов
/ 26 июля 2011

Вместо вызова параметра имени файла 'parameter' и определения его в вашем маршруте, назовите его 'filename' и НЕ определяйте его в вашем маршруте.

Ваш код действия будет таким же, но имя файла перестанет быть частью маршрута и будет просто обычным параметром URL.

Если вы недовольны модой в этом сезоне на неприязнь к параметрам URL, то вы можете найти это отвратительно, но это просто мода, и ее можно смело игнорировать.

Лично я бы не стал передавать подобные пути в веб-приложение, потому что я был бы абсолютно параноиком по поводу создания угроз обхода по ошибке - я только когда-либо передаю имена файлов без пути, проверяю их по списку и затем выбираю файл.

0 голосов
/ 26 июля 2011

Разве вы не можете просто декодировать параметр?

http://msdn.microsoft.com/en-us/library/6196h3wt.aspx

0 голосов
/ 26 июля 2011

В .NET 4.0 beta 2 команда CLR предложила обходной путь.

Добавьте это в свой файл web.config:

<uri> 
    <schemeSettings>
        <add name="http" genericUriParserOptions="DontUnescapePathDotsAndSlashes" />
    </schemeSettings>
</uri>

Это приводит к тому, что класс Uri ведет себя в соответствии с RFC, описывающим URI, что позволяет экранировать косые черты в пути без экранирования. Команда CLR сообщает, что они отклоняются от спецификации по соображениям безопасности, и установка этого параметра в вашем файле .config в основном заставляет вас принять на себя дополнительные соображения безопасности, связанные с небрежным слешем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...