Cross-Origin Request sharing (CORS): Atrybut EnableCors

O atrybucie EnableCors już wspomniałem w pierwszym poście o CORS.  Dzisiaj chciałbym przyjrzeć mu się dokładniej.  Dla przypomnienia, najczęściej dekoruje im się kontrolery:

    [EnableCors( "http://localhost:24018","*","*")]
    public class ValuesController : ApiController
    {
        // GET api/values/5
        public string Get()
        {
            return "Hello World@";
        }
    }

Możliwe jest jednak dołączenie go do pojedynczej metody (akcji):

    public class ValuesController : ApiController
    {
        [EnableCors("http://localhost:24018", "*", "*")]
        public string Get()
        {
            return "Hello World";
        }
    }

Jeśli chcemy nałożyć atrybut globalnie, wtedy w WebConfig możemy:

    public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {

            var cors = new EnableCorsAttribute("http://localhost:24018", "*", "*");
            config.EnableCors(cors);

            // Web API routes
            config.MapHttpAttributeRoutes();

            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );
        }
    }

Origin określa adres klienta czyli konsumenta danej usługi. W powyższym przypadku wyłącznie http://localhost:24018 uzyskuje dostęp do API. Możemy przekazać gwiazdkę (*) jeśli chcemy zezwolić wszystkim klientom:

[EnableCors(origins: "*", 
    headers: "*", methods: "*")]

Oczywiście odradzam akceptowanie wszystkich klientów ze względu na bezpieczeństwo. Każde zapytanie AJAX, będzie mogło korzystać z naszego API, co potencjalnie może być wykorzystane np. w phishing.
Dozwolone jest również przekazanie listy adresów po przecinku:

[EnableCors(origins: "http://www.address1.com,http://www.address2.com"", 
    headers: "*", methods: "*")]

We wszystkich parametrach można podać listę wartości po przecinku. Na przykład:

[EnableCors(origins: "http://www.address1.com", 
    headers: "accept,content-type,origin,x-my-header", methods: "*")]

Niestety różne przeglądarki interpretują inaczej headers i nie można ma tym polegać. Cały mechanizm CORS mocno polega na implementacji przeglądarki. To ona w końcu decyduje jakie pakiety wysłać do serwera i kiedy zezwolić na połączenie. Zdecydowana większość przeglądarek nie pozwala na między domenowe połączenia, ale nie wszystkie w pełni implementują CORS. Może zdarzyć się, że po prostu lista nagłówków nie zostanie wysłana jako część zapytania CORS.

Analogicznie sprawa wygląda z metodami HTTP:

[EnableCors(origins: "http://www.address1.com", 
    headers: "*", methods: "GET,POST")]

To ostatni post o CORS. W następnym wpisie powracam do zaczętej w poprzednim tygodniu tematyki o bezpieczeństwie aplikacji WEB.

One thought on “Cross-Origin Request sharing (CORS): Atrybut EnableCors”

  1. Jak ustawiam methods: “GET” a wysyłam za pomocą AJAX żądanie POST to żądanie nie jest blokowane. Dlaczego?

Leave a Reply

Your email address will not be published.