Определите, является ли HTTP-запрос мыльным запросом в HttpApplication.AuthenticateRequest - PullRequest
3 голосов
/ 21 января 2010

Есть ли способ узнать, является ли запрос мыльным запросом для события AuthenticateRequest для HttpApplication? Проверка ServerVariables ["HTTP_SOAPACTION"], кажется, не работает все время.

public void Init(HttpApplication context) {
    context.AuthenticateRequest += new EventHandler(AuthenticateRequest);
}

protected void AuthenticateRequest(object sender, EventArgs e) {
    app = sender as HttpApplication;
    if (app.Request.ServerVariables["HTTP_SOAPACTION"] != null) {
        // a few requests do not enter here, but my webservice class still executing
        // ...
    }
}

Я отключил HTTP POST и HTTP GET для веб-сервисов в моем файле web.config.

<webServices>
    <protocols>
      <remove name="HttpGet" />
           <remove name="HttpPost" />
      <add name="AnyHttpSoap" />
    </protocols>
</webServices>

Просмотр ContentType для мыла + xml только частично решает мою проблему. Например,

Cache-Control: no-cache
Connection: Keep-Alive
Content-Length: 1131
Content-Type: text/xml
Accept: */*
Accept-Encoding: gzip, deflate
Accept-Language: ro
Host: localhost
mymethod: urn:http://www.wsnamespace.com/myservice

У некоторых клиентов вместо стандартного заголовка SOAPAction: "http://www.wsnamespace.com/myservice/mymethod", есть что-то похожее на пример выше." Mymethod "представляет метод в моем классе веб-службы с атрибутом [WebMethod] и" http://www.wsnamespace.com/myservice" - это пространство имен веб-службы. Тем не менее сервис работает совершенно нормально. Потребители используют разные фреймворки (NuSOAP из PHP, .NET, Java и т. Д.).

Ответы [ 5 ]

2 голосов
/ 21 января 2010

Вы можете посмотреть свойство Request.ContentType, которое при правильной установке клиентом должно быть

application/soap+xml; charset=utf-8

Часть utf-8 может отсутствовать.

Кроме этого, конечно, вы можете просто проверить URL-адрес, и если это веб-сервис, то он говорит вам, что это такое.

0 голосов
/ 26 июня 2013

Я использую следующий код для определения типа запроса. Попробуйте, если это соответствует вашему требованию. Отметьте как ответ, если это поможет вам.

if (request.Headers["SOAPAction"] != null || request.ContentType.StartsWith("application/soap+xml"))
    return ServiceRequestTypes.SoapRequest;
else if ("POST".Equals(request.RequestType, StringComparison.InvariantCultureIgnoreCase) && request.ContentType.StartsWith("application/x-www-form-urlencoded", StringComparison.InvariantCultureIgnoreCase))
    return ServiceRequestTypes.HttpPostRequest;
else if ("POST".Equals(request.RequestType, StringComparison.InvariantCultureIgnoreCase) && request.ContentType.StartsWith("application/json", StringComparison.InvariantCultureIgnoreCase))
    return ServiceRequestTypes.AjaxScriptServiceRequest;
return ServiceRequestTypes.Unknown;
0 голосов
/ 16 марта 2011

Проверяли ли вы System.Web.HttpContext.Current.Request.CurrentExecutionFilePathExtension ?? Обычно это будет .asmx для веб-сервисов (json и xml), если, конечно, вы обрабатываете сервис.

0 голосов
/ 03 марта 2010

Вы также можете пойти по более сложному маршруту и ​​выяснить все на основе всего, что находится ниже заголовков HTTP. Под этим я подразумеваю анализ таких вещей, как ниже, который является телом запроса SOAP - частью запроса ...

<soap:Envelope xmlns:soap="..." soap:encodingStyle="...">

IBM

0 голосов
/ 21 января 2010

Я всегда даю веб-сервисам свой собственный порт. Таким образом, мне не нужно фильтровать каждый HTTP-запрос, поступающий через порт 80. Вернее, я могу фильтровать порт 80 для проблем, связанных с браузером, и порты SOAP / SOA для других типов атак.

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

...