WedX - журнал о программировании и компьютерных науках

Предотвращение выполнения страниц asp.net в подпапке

У меня есть сайт dotnet, который содержит виртуальный каталог (/ ArticleImages), который сопоставляется с общим файловым ресурсом на другом сервере. Общий файловый ресурс доступен для большого количества людей, поэтому в качестве меры безопасности я не хочу, чтобы в этой папке выполнялись какие-либо страницы asp.net (например, помещая default.aspx в общий файловый ресурс и просматривая site.com/ArticleImages /default.aspx не должен служить или, желательно, служить простой загрузкой, а не выполнением).

Я использую IIS 6.0 и добавил виртуальный каталог. Если я удалю приложение из этой папки, оно будет использовать родительское приложение и пожаловаться на то, что не может прочитать файл web.config. Если я добавляю приложение в эту папку, даже если я удаляю все расширения приложения, он жалуется, что svc-xyzzy (учетная запись, используемая для доступа к общему ресурсу) не имеет доступа к 'C: \ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727 \ временные файлы ASP.NET '.

Как создать подпапку приложения, которое не выполняет код dotnet?

02.11.2012

Ответы:


1

Если общий файловый ресурс доступен для чтения пользователю, в котором работает ваш пул приложений (по умолчанию сетевая служба), вы можете полностью удалить виртуальный каталог и создать приложение ASP.NET, которое будет передавать файлы в браузер. Если вы используете MVC, он просто возвращает результат файла. Это дает дополнительное преимущество в том, что вы можете запретить пользователям скачивать файлы. то есть вы можете потребовать, чтобы пользователь вошел в систему или имел определенные разрешения для загрузки файлов. Также убедитесь, что вы проверяете обход пути, вы не хотите, чтобы пользователь, вводящий ../../filename, загружал файлы, которые им не разрешены.

Вариант 1. ASP.NET MVC

public ActionResult Download(string file)
{
    // Check for directory traversal attack
    if(file.IndexOf('\\') > -1 || file.IndexOf('/') > -1)
    {
        return new HttpNotFoundResult();
    }

    file = System.IO.Path.Combine("\\FILE_SHARE_FOLDER\\", file);

    if(!System.IO.File.Exists(file))
    {
        return new HttpNotFoundResult();                
    }

    return this.File(file, GetMimeType(file));
}

Вариант 2. Веб-формы

private void DownloadFile(string file)
{
    // Check for directory traversal attack
    if(file.IndexOf('\\') > -1 || file.IndexOf('/') > -1)
    {
        Response.StatusCode = 404;
        Response.End();
    }

    file = System.IO.Path.Combine("\\FILE_SHARE_FOLDER\\", file);

    if (!System.IO.File.Exists(file))
    {
        Response.StatusCode = 404;
        Response.End();
    }

    Response.ContentType = GetMimeType(file);
    Response.TransmitFile(file);
}

Примечание. Вам понадобится метод для получения типов MIME как для MVC, так и для веб-форм (Метод типа MIME из KodeSharp)

private string GetMimeType(string fileName)
{
    string mimeType = "application/unknown";
    string ext = System.IO.Path.GetExtension(fileName).ToLower();
    Microsoft.Win32.RegistryKey regKey = Microsoft.Win32.Registry.ClassesRoot.OpenSubKey(ext);
    if (regKey != null && regKey.GetValue("Content Type") != null)
        mimeType = regKey.GetValue("Content Type").ToString();
    return mimeType;
} 
03.11.2012
  • с .Net MVC ›= 4.5 вам понадобится MimeMapping.GetMimeMapping () 13.06.2019

  • 2

    Вы можете проверить global.asax для запроса, и если он исходит из каталогов, которые вы не разрешаете, остановите обработку как:

    protected void Application_BeginRequest(Object sender, EventArgs e)
    {
        string cTheFile = HttpContext.Current.Request.Path;
    
        if(cTheFile.StartsWith("/articleimages", StringComparison.CurrentCultureIgnoreCase)
        {
            HttpContext.Current.Response.TrySkipIisCustomErrors = true;
            HttpContext.Current.Response.Write("Please start from home page");
            HttpContext.Current.Response.StatusCode = 403;
            HttpContext.Current.Response.End();
            return ;
        }   
    }
    

    Конечно, вы можете просто разместить один дополнительный web.config в каталоге с этим внутри:

    <configuration>
        <system.web>
          <authorization>
            <deny users="*" />
          </authorization>
        </system.web>
    </configuration>
    

    но если они могут удалить, это бесполезно как код.

    02.11.2012
  • .net установлен как обработчик подстановочных знаков в корневом приложении, поэтому мне пришлось бы встроить какой-то фильтр в код, но я думаю, это может сработать. К сожалению, у них будет невозможен доступ к редактированию / удалению опции web.config. 03.11.2012
  • @Zarigani Первое решение, которое у меня есть, будет выполнено. 03.11.2012
  • Новые материалы

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..

    ИИ в аэрокосмической отрасли
    Каждый полет – это шаг вперед к великой мечте. Чтобы это происходило в их собственном темпе, необходима команда астронавтов для погони за космосом и команда технического обслуживания..


    Для любых предложений по сайту: [email protected]