SharePoint 2010: отключить / скрыть ссылки на SPSDisco.aspx

#sharepoint #iis-7 #sharepoint-2010

#sharepoint #iis-7 #sharepoint-2010

Вопрос:

После обновления некоторых наших внешних веб-сайтов, работающих в SharePoint 2007, до 2010, мы запустили проверку ссылок, чтобы найти проблемы. Мы заметили, что в журнале отображаются запросы к файлу с именем spsdisco.aspx. Действительно, при проверке источника наших веб-страниц SharePoint добавляет на страницу следующий элемент link HEAD :

 <link href="_vti_bin/spsdisco.aspx" rel="alternate" type="text/xml" />
  

Это файл обнаружения веб-службы, в котором перечислены имена и местоположения всех конечных точек веб-службы SharePoint. Что еще хуже, этот файл начинает отображаться в индексах поиска. В лучшем случае это вызывает смущение; в худшем случае это потенциальная уязвимость (это внешние веб-сайты). Поскольку это виртуальный файл, он отображается на каждом сайте и дочернем сайте, поэтому ручной подход к «скрытию» каждого из них сложен и неуклюж.

Кажется, я не могу найти никакой фактической документации по этому поводу — несколько ссылок на его обновление для включения пользовательской веб-службы, но не более того. Как мы могли бы подойти к надежному, нисходящему подходу к отключению доступа к этим страницам? Я думаю, мы можем найти способ подавить LINK элемент на странице, но это просто скрывает проблему.

Есть ли в SharePoint место (сайт или центральный администратор), чтобы отключить это? Не могли бы вы просто добавить некоторую фильтрацию запросов в IIS, чтобы запретить доступ к SPSdisco.aspx и файлам ASMX?


Обновление: По предложению Kev я разместил перекрестную публикацию на sharepoint.stackexchange.com.


Обновление 2: Видите, я не отказался от этого вопроса. Наконец-то у нас появилось время ознакомиться с некоторыми рекомендациями MS и создать развертываемое решение SharePoint для решения проблемы.

Комментарии:

1. Странно — я также могу получить доступ к файлу DISCO через «_vti_bin spdisco.aspx» (вместо «spSdisco.aspx»)

Ответ №1:

В качестве быстрого исправления я бы добавил правило фильтрации запросов для запрета доступа к SPSDisco.aspx .

Но, возможно, вам захочется спросить на новом сайте SharePoint Stack Exchange о более надежном исправлении:

https://sharepoint.stackexchange.com/

Комментарии:

1. Спасибо, я принял ваше предложение. Я обновил OP ссылкой на мой вопрос на другом сайте.

Ответ №2:

Вот решение, к которому мы пришли. Частично это было основано на рекомендациях нашего представителя Microsoft, поэтому вы можете считать это неофициальным, «официальным» подходом.

Во-первых, нам нужно запретить SharePoint рекламировать файл disco всему миру (то есть Google). Просто удалите следующую строку на своих основных страницах:

 <SharePoint:SoapDiscoveryLink runat="server"/>
  

Это приведет к подавлению <link href="/_vti_bin/spsdisco.aspx" rel="alternate" type="text/xml"> ссылки в заголовке ваших страниц.

Далее, мы хотим убедиться, что неавторизованные пользователи не имеют доступа к веб-службам, описанным в файле disco, или к чему-либо еще в _vti_bin , если уж на то пошло. Если ваш сайт работает только внутри вашего брандмауэра (например, в интрасети), то это не так важно. Но если у вас есть анонимные конечные точки, к которым можно получить доступ извне, вы хотите, чтобы они были заблокированы.

Это отличное приложение для HttpModule. Мы создадим систему, которая перехватывает любой запрос, содержащийся _vti_bin в пути, и, если текущий пользователь не авторизован, вернет 404 NOT FOUND код состояния. Я решил вернуть значение 404, а не 401 UNAUTHORIZED потому что я не просто хочу заблокировать эти пути, я хочу скрыть тот факт, что на этих путях вообще что-либо существует.

Наш HttpModule выглядит следующим образом:

 using System;
using System.Web;

namespace Custom.SharePoint.HttpModule.SpSecureVtiBin {

    public class SpSecureVtiBinModule : IHttpModule {

        #region IHttpModule Members

        public void Dispose() { }

        public void Init( HttpApplication context ) {
            context.AuthorizeRequest  = new EventHandler( context_AuthorizeRequest );
        }

        protected virtual void context_AuthorizeRequest( object sender, EventArgs e ) {
            HttpApplication app = (HttpApplication)sender;
            string requestedPath = app.Request.Path;

            if ( requestedPath.ToLowerInvariant().Contains( "_vti_bin" ) ) {
                if ( !app.Request.IsAuthenticated ) {
                    app.Response.StatusCode = 404;
                    app.Response.StatusDescription = "Not Found";
                    app.Response.Write( "404 NOT FOUND" );
                    app.Response.End();
                }
            }
        }

        #endregion
    }
}
  

Достаточно просто. Чтобы использовать HttpModule, он должен быть зарегистрирован в файле web.config сайта с записью в разделе configurationsystem.webServermodules :

 <add name="SpSecureVtiBinModule" type="Custom.SharePoint.HttpModule.SpSecureVtiBin.SpSecureVtiBinModule, Custom.SharePoint.HttpModule.SpSecureVtiBin, Version=1.0.0.0, Culture=neutral, PublicKeyToken=[your_public_key_token]" />
  

Конечно, мы не хотим изменять файл web.config приложения SharePoint вручную. Мы создадим SPFeatureReceiver для выполнения задания:

 using System.Collections.ObjectModel;
using Microsoft.SharePoint;
using Microsoft.SharePoint.Administration;

namespace Custom.SharePoint.HttpModule.SpSecureVtiBin {

    public class ModuleFeatureReceiver : SPFeatureReceiver {

        private static string _owner = "SpSecureVtiBinModule";

        public override void FeatureActivated( SPFeatureReceiverProperties properties ) {
            SPWebApplication app = (SPWebApplication)properties.Feature.Parent;

            app.WebConfigModifications.Add( GetModificationForSystemWebServer() );
            app.WebService.ApplyWebConfigModifications();
            app.Update();
        }

        public override void FeatureDeactivating( SPFeatureReceiverProperties properties ) {

            SPWebApplication app = (SPWebApplication)properties.Feature.Parent;
            Collection<SPWebConfigModification> mods = app.WebConfigModifications;

            int modCount = mods.Count;
            bool modRemoved = false;

            for ( int i = modCount - 1; i >= 0; i-- ) {
                SPWebConfigModification mod = mods[i];
                if ( mod.Owner.Equals( _owner ) || mod.Owner.Equals( "CHK.SharePoint.HttpModule.SpSecureVtiBin.SpSecureVtiBinModule" ) ) {
                    app.WebConfigModifications.Remove( mod );
                    modRemoved = true;
                }
            }

            if ( modRemoved ) {
                app.WebService.ApplyWebConfigModifications();
                app.Update();
            }
        }

        private SPWebConfigModification GetModificationForSystemWebServer() {
            return new SPWebConfigModification {
                Name = "add[@name='SpSecureVtiBinModule']",
                Owner = _owner,
                Path = "configuration/system.webServer/modules",
                Value = @"<add name=""SpSecureVtiBinModule"" type=""Custom.SharePoint.HttpModule.SpSecureVtiBin.SpSecureVtiBinModule, Custom.SharePoint.HttpModule.SpSecureVtiBin, Version=1.0.0.0, Culture=neutral, PublicKeyToken=[your_public_key_token]"" />",
                Sequence = 0
            };
        }
    }
}
  

Теперь все, что осталось, это упаковать HttpModule. Вам нужно будет определить функцию в пакете и сослаться на класс SPFeatureReceiver. Это приведет к добавлению записи web.config при активации функции и удалению записи при деактивации функции. Укажите функцию для WebApplication и цель развертывания сборки для GlobalAssemblyCache .