Domanda

Sto progettando un'API RESTful in cui alcune chiamate sono pubbliche su HTTP e alcune richiedono una chiave API e crittografia su HTTPS.Sto riflettendo su quale codice di risposta dovrebbe essere inviato se una richiesta HTTP viene inviata a una delle risorse private.Finora l'unico che mi salta all'occhio è 412 - Precondizione non riuscita, ma lo standard indica che la precondizione è imposta dal richiedente e non dal server.

Esiste un codice di risposta appropriato per questa condizione o devo solo arrendermi e farlo 400?

È stato utile?

Soluzione

Il modo più sicuro per forzare il client HTTP a utilizzare HTTPS è Sicurezza del trasporto rigorosa HTTP.

In precedenza un suggerimento comune era quello di interrompere la connessione, ma questo la pratica è stata rimossa a favore dell'HSTS (Sito web OWASP).

Altri suggerimenti

Non posso dire se questo sia ampiamente accettato dai client HTTP, ma parlando strettamente RFC, il server dovrebbe rispondere con:

HTTP/1.1 426 Upgrade Required
Upgrade: TLS/1.0, HTTP/1.1
Connection: Upgrade

Fonte:
http://tools.ietf.org/html/rfc2817#section-4.2

Il codice di errore appropriato da restituire sarebbe simile a 403.4 - SSL richiesto.

Anche se non esplicitamente documentato nel RFC per HTTP 1.1, questo comportamento corrisponde ai requisiti qui delineati:

Il server ha compreso la richiesta, ma si rifiuta di soddisfarla.L'autorizzazione non aiuterà e la richiesta NON DEVE essere ripetuta.Se il metodo di richiesta non era HEAD e il server desidera rendere pubblico il motivo per cui la richiesta non è stata soddisfatta, DOVREBBE descrivere il motivo del rifiuto nell'entità.Se il server non desidera rendere disponibili queste informazioni al client, è possibile utilizzare invece il codice di stato 404 (Non trovato).

Aggiungere il proprio sottocodice (come nell'esempio SSL) potrebbe essere utile in alcuni casi, ma poiché questo sottocodice non sarebbe significativo per terze parti, lo sconsiglio.

Quindi, il tuo messaggio di errore finale sarebbe qualcosa come "403 - Private Resource".Tieni presente che, anche nel caso di una chiave API mancante, non dovrebbe essere utilizzato "401 - Unauthorized", a meno che la tua chiave API non possa effettivamente essere trasmessa in un campo di intestazione WWW-Authenticate.

Restituire a 403 con frase motivazionale "HTTPS obbligatorio" sembra un'opzione pratica e quella che uso.

Vedere https://en.wikipedia.org/wiki/HTTP_403

Reindirizzare un'API REST non è una buona idea, soprattutto perché potresti non avere idea di come o cosa sta consumando il tuo servizio.

Basta inviare un reindirizzamento al corrispondente https:URI.

AGGIORNAMENTO

È una risposta sbagliata: vedi i commenti qui sotto

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top