Previene l'abuso sull'endpoint dell'API REST

8

Domanda 1

Ho un endpoint dell'API di accesso

http://127.0.0.1:8080/api/account/login

Controlla se il numero di telefono è stato convalidato. In caso contrario chiamerà

POST http://127.0.0.1:8080/api/account/sendsms  country_code=1, phone_number=1234567

Come posso prevenire l'abuso nella richiesta di sms? (Mi costerà denaro da parte mia, ho anche la funzione di throttle)
Voglio solo inviare sms se /login fallisce (a questo punto l'email è stata validata)
Il mio modo è di inviare un'intestazione personalizzata X-TOKEN-SMS che agisca come un'intestazione di autorizzazione con token jwt. Il token jwt X-TOKEN-SMS viene creato a /login se il numero di telefono non è validato = True.
Quando /sendsms decodifica il jwt senza errori, procedi con la richiesta di sms. Se jwt decodifica con errore, il front-end reindirizzerà a /login .

Questo metodo è una buona pratica?
Come si consente l'accesso a un endpoint dell'API solo se è stato effettuato l'accesso a un endpoint?

Domanda 2

Diciamo che ho un endpoint a cui è possibile accedere solo da un utente autorizzato

http://127.0.0.1:8080/api/account/points

L'utente può ottenere punti (recuperare tutti i suoi punti) Punti POST (crea un nuovo punto) o PATCH (aggiorna un punto)

Come posso impedire a un utente autorizzato di abusare del POST / punti? Potrebbero aggiungere punti a loro piacimento, il che non è ciò che la mia app vorrebbe che fosse. L'aggiunta di punti dovrebbe essere gestita dalla logica dell'app.

Se il punto di aggiunta non dovrebbe essere utilizzato dall'API REST, quindi creare una nuova riga direttamente sul db è più sicuro?

Ho trovato una domanda simile posta prima di Secure Rest api da utente autenticato Ma sembra che non riesca a capirlo.

    
posta momokjaaaaa 30.04.2016 - 00:50
fonte

2 risposte

3

Per la prima domanda, il tuo approccio mi sembra corretto. Si consuma un token nella voce sendsms che può essere generata solo dall'endpoint login . È anche possibile utilizzare un token generico creato dal login e non facilmente ipotizzabile (sarebbe equivalente a un ID di sessione generato da crittografia), utilizzato come chiave primaria per una tupla del database. Lì puoi memorizzare quello che vuoi (ad esempio il numero di SMS ancora permesso di essere inviato).

Puoi anche memorizzare lo "stato" in una variabile e proteggerlo usando, diciamo, HMAC, scambiandolo continuamente tra il server e il client, ma hai ancora bisogno di qualche stato del server da difendere contro riprodurre attacchi su endpoint non idempotenti; al minimo, è necessario un contatore incrementale per sessione.

Il secondo problema è più complicato e per prima cosa è necessario chiedersi quale sia la differenza di comportamento (vista dal server) tra l'app e la sua logica e un utente malintenzionato che invia richieste ripetute. Potresti far rispettare un ritardo minimo tra le richieste che è paragonabile alla massima velocità con cui l'app può essere guidata, in modo che non ci sia più un vantaggio nell'uso di trucchi piuttosto che nell'app.

    
risposta data 30.04.2016 - 01:27
fonte
3

Ecco un problema con il tuo approccio proposto. Se invii le richieste via HTTP, una terza parte può spiare il traffico e scegliere il token di autorizzazione. Quindi possono inviare le proprie richieste al punto finale utilizzando il token.

Soluzione: usa HTTPS anziché HTTP quando esegui l'autorizzazione iniziale per ottenere il token e ogni volta che utilizzi il token.

Per la tua seconda domanda, il problema è fondamentalmente intrattabile. Presumo che questi "punti" siano qualcosa che dovrebbe essere cambiato solo in base ad alcune regole che hai stabilito. A meno che le regole siano tali da poter rilevare cheats dal lato server sei bloccato. L'unico modo per risolverlo è implementare tutto ciò che è direttamente o indirettamente coinvolto nel punteggio sul lato server. Questo probabilmente sconfigge lo scopo del tuo gioco.

Ho notato che stai usando 127.0.0.1. Immagino che sia solo un segnaposto per il vero indirizzo IP.

In caso contrario, tieni presente che stai parlando a un servizio in esecuzione sul proprio computer / dispositivo dell'utente. Se l'utente ha accesso fisico e tempo / esperienza sufficienti, molto probabilmente può sovvertire qualsiasi controllo di accesso implementato nel servizio.

Lo stesso vale per qualsiasi logica lato client finalizzata a far rispettare le regole o a prevenire l'imbroglio.

(Ti sei mai chiesto perché gli MMO e simili hanno problemi con i cheat? Non è perché i venditori non provano. È perché è impossibile per sconfiggere i cheat nel software se i cheat controllano la piattaforma lato client in cui viene eseguito il software.)

    
risposta data 30.04.2016 - 04:39
fonte

Leggi altre domande sui tag