2015-07-21 21 views
6

Ho lavorato a un progetto di e-commerce basato su Symfony2 (per il backend) e AngularJS per il frontend. Attualmente la parte Symfony è usata solo come API, che ha tre diversi livelli utente (ospite, cliente & admin). Diverse le azioni che si possono fare all'interno del sistema (come aggiungere/rimuovere i dati) sono garantiti da:Symfony2 RESTful API + AngularJS

1) Symfony2 Firewall con ruoli utente/controllo di accesso
2) JMS supplementari di sicurezza (espressioni @PreAuthorize)

Per le parti che sono sicure tutto funziona come previsto e sono molto contento del modo in cui funzionano le cose.

Problema:

Non ci sono parti della API, che sono pubblici (come il recupero delle informazioni di prodotto, categorie, ecc). Sto recuperando tali dati in Angular con le chiamate Ajax alla mia API che restituisce i dati in formato JSON. Un esempio potrebbe essere:?

/api/prodotto/get-all/page = 1 & count = 10 & di ordinamento [id] = asc

Il problema è che chiunque poteva guardare il richiede nel browser e copia il percorso e ha accesso a tutti i dati (come tutti i prodotti) e potrebbe semplicemente scaricare un JSON di tutte le informazioni. Sebbene questi dati siano "pubblici", non voglio dare ad altri un modo così semplice di "rubare" i miei dati.

Idee & possibili soluzioni:

1) stavo guardando lo standard JWT (JSON Web Token) per cercare di fissare le chiamate pubbliche al mio API ed implementarlo in modo tale che ho generato un token per gli utenti "reali" presenti sul sito Web e limitano l'accesso diretto ai collegamenti API pubblici.

Cosa ne pensi? Questa sarebbe una possibile soluzione?

2) Stavo anche leggendo in un'altra domanda su StackOverflow che potevo controllare l'intestazione HTTP_X_REQUESTED_WITH dalla richiesta, ma sappiamo tutti che questo può essere facilmente falsificato da un utente malintenzionato.

3) Infine, ho letto un approccio simile a "soluzione" 1) qui: http://engineering.talis.com/articles/elegant-api-auth-angular-js/ ma non sono del tutto sicuro che questo si adatti al mio scopo.

Note aggiuntive:

  • non voglio fare questo a prova di proiettile, ma anche non si vuole dare alla gente la possibilità di fare clic 2 pulsanti e ottenere tutti i miei dati. So che alla fine tutte le informazioni possono essere "rubate" (ad esempio usando un web scrapper), ma "assicurare" il sistema in modo tale che le persone dovrebbero fare un piccolo sforzo è quello che ho in mente.
  • non posso davvero rimodellare il mio API troppo in questa fase, ma tutte le idee sarebbe apprezzato

Grazie per aver il tempo di leggere la mia domanda e non vedo l'ora per tutte le risposte.

+0

non puoi davvero proteggere i dati pubblici, perché si _want_ il pubblico di essere in grado di vedere che i dati . Puoi provare a rendere più difficile ottenere tutti i dati, ma questo è tutto. Accettate semplicemente che i dati pubblici sono pubblici, e investite il vostro potere in cose migliori e produttive. – smat88dd

risposta

2

È possibile limitare l'abuso del sistema in vari modi, tra cui:

  • limitare il numero totale di richieste che API tornerà prima di richiedere CAPTCHA o qualche altro metodo di convalida Questo può essere limitato da IP, impronta digitale del browser, token di autenticazione, ecc.

  • Rende difficile all'utente abusare di indovinare ID di prodotti, categorie, ecc. Utilizzando GUID o altri ID generati casualmente.

  • gestione Usa proxy API come Azure API di gestione per una gestione più a livello aziendale delle API (http://justazure.com/azure-api-management-part-one-introduction/)

0

Si potrebbe provare qualcosa di simile:

  1. Per accedere al sito gli utenti anonimi devono prima compilare il captcha per ottenere Token temporanea.
  2. Aggiungi controllo referrer.
  3. La quantità minima di dati che gli utenti anonimi possono visualizzare. Ad esempio, i primi 50 prodotti.

In questo modo, chiunque desideri rubare i dati, deve prima ottenere un token temporaneo anonimo compilando il captcha e cambiando il referrer.