Come negare l'accesso agli endpoint del mio server? (PHP)

3

Ho sviluppato alcuni software installati, ad es. su www.example.com . Vi si accede tramite una pagina Web HTML. Alcuni pulsanti HTML possono chiamare endpoint PHP che si trovano anche su quel dominio. Io uso JWT per proteggere il login.

Ma quello che voglio fare è solo consentire l'accesso ai punti finali dall'ufficio, quindi sto cercando di far sì che il PHP blocchi qualsiasi accesso da altri domini. Ma ovviamente dato che il software è ospitato dal dominio www.example.com , invia richieste di endpoint da quel dominio, che è quello che penso abbia finora vanificato i miei attuali tentativi.

Ho provato

header('Access-Control-Allow-Origin: https://www.example.com');

ma non pensate che funzionerà per il motivo sopra. Certamente non blocca il punto finale quando provo ad accedervi tramite l'interfaccia web di dominio www.example.com , nonostante la rete di computer che uso.

Forse invece devo controllare l'IP del client all'interno del PHP e negare l'accesso se non corrisponde. Ma cosa succede se ci sono IP dinamici e gli IP potrebbero cambiare dato un tempo sufficiente. C'è un modo per aggirare questo?

Qualsiasi aiuto apprezzato.

    
posta Antinous 03.09.2018 - 14:15
fonte

3 risposte

6

Innanzitutto, per quanto riguarda ciò che hai già provato:

header('Access-Control-Allow-Origin: https://www.example.com');

Questo fallirà per una serie di motivi:

  1. Questo è un controllo a livello di client che non impedisce a nessuno di inoltrare richieste all'endpoint. Questo è, in effetti, un flag per CORS in un browser, e non è effettivamente rilevante per il tuo caso d'uso. Non avrebbe alcun impatto con la tua configurazione attuale, né fermerebbe necessariamente le persone ad accedere ai tuoi endpoint API anche se si trovavano su un altro dominio ( CORS è una restrizione di lettura, non una restrizione di scrittura).
  2. Come alludi a, anche se questo ha funzionato come previsto, in realtà non farebbe quello che vuoi, dal momento che impedirebbe alle persone di utilizzare il tuo endpoint all'interno di un browser su un dominio diverso, ma che in realtà non lo bloccherebbe al tuo ufficio
  3. Inoltre non funzionerebbe comunque perché indipendentemente da quali intestazioni si passano indietro, qualsiasi client non browser può ignorare le intestazioni e solo fare ciò che vuole. Cioè un browser ascolterà le restrizioni di CORS (perché è così che funzionano i browser) ma posso raggiungere qualsiasi endpoint che voglio con curl , postman , o qualsiasi altro client http e fare qualunque cosa voglio comunque. Non sono solo i browser che utilizzano Internet, quindi non puoi fare ipotesi su chi sta navigando nel tuo sito come.

Filtro IP

In un caso come questo la cosa migliore è semplicemente filtrare per indirizzo IP, che hai citato. Generalmente gli uffici hanno indirizzi IP statici o cambiano raramente, quindi è in realtà abbastanza fattibile. Presumendo che l'intero ufficio sia NATato dietro un router / indirizzo IP, è piuttosto semplice perché è sufficiente una sola regola: scaricare tutto il traffico eccetto la porta 80 (443?) Proveniente dall'IP dell'ufficio. Probabilmente non dovresti preoccuparti di farlo con PHP, tuttavia, perché PHP per rifiutare la richiesta sulla base dell'indirizzo IP richiede prima che il tuo server elabori la richiesta, lanci PHP e la trasmetta. Una semplice regola del firewall è molto più semplice sulle risorse del server. Gli indirizzi IP dinamici degli uffici sono quasi sconosciuti, quindi a meno che tu non sappia che questa è la situazione per te, non me ne preoccuperei.

    
risposta data 03.09.2018 - 14:51
fonte
3

La tua idea sui domini è piuttosto sbagliata. Devi capire una cosa essenziale su un server web.

Non esiste una cosa come "un accesso da un dominio". Non è un "software" che invia richieste agli endpoint ma un client (che di solito è un browser). Un cliente può leggere prima alcune informazioni dal tuo server, ma non è necessario.

Per farla breve, non puoi limitare un accesso ai tuoi endpoint "da un dominio".

L'idea per l'indirizzo IP è più fruttuosa e più plausibile di quanto pensi. Gli uffici raramente cambiano il loro IP, meno usano uno dinamico. Pertanto, puoi limitare l'accesso all'intero server www.example.com (non solo agli endpoint) in base all'indirizzo IP del tuo ufficio.

Anche se c'è un altro colpevole, dato che l'indirizzo IP può essere falsificato , e quindi è possibile creare una richiesta che gli consentirà di inviare qualcosa al tuo endpoint (tuttavia senza la possibilità di ottenere il risposta).

Tuttavia, ritengo che una protezione del genere non sia necessaria dato che si sta utilizzando JWT per l'autenticazione (e, presumo, HTTPS per la connessione protetta).

    
risposta data 03.09.2018 - 14:35
fonte
1

Ok, questo è il modo in cui ho risolto il problema:

Nel File Manager del tuo server, nella cartella in cui desideri limitare l'accesso, crea un nuovo file .htaccess e aggiungi le seguenti righe:

Order Deny, Allow
Deny from all
Allow from 1.2.3.4

dove 1.2.3.4 è l'indirizzo IP che desideri consentire.

Puoi concedere un accesso aggiuntivo tramite la virgola che separa gli indirizzi IP o, se non funziona, utilizza solo Allow from di righe aggiuntive.

Credo che sia possibile aggiungere anche indirizzi IP con caratteri jolly.

    
risposta data 03.09.2018 - 17:02
fonte

Leggi altre domande sui tag