2009-12-03 19 views
5

Sto utilizzando REST e OAuth per parlare con un'app Rails (da un'app per iPhone, ma non dovrebbe essere rilevante). Tuttavia, sto riscontrando alcuni problemi con la protezione CSRF di Rails (tramite protects_from_forgery).Protezione Rails, OAuth e CSRF

Comprendo che la protezione CSRF viene attivata solo per invii regolari di moduli (ad esempio Content-Type = application/x-www-form-urlencoded), quindi mi andrebbe bene se stessi inviando dati JSON o XML. Sfortunatamente, OAuth è attualmente limitato alle richieste application/x-www-form-urlencoded. C'è uno draft spec that extends OAuth to non-form-urlencoded data, ma questo non mi aiuta in questo momento.

Il mio modo di vedere, ho le seguenti opzioni:

  1. Invia i dati come JSON, sapendo che non sarebbe parte della firma OAuth e quindi soggetti a man-in-the- attacchi di mezzo. Ovviamente non è una soluzione allettante.

  2. Creare azioni Rails speciali (ad esempio UsersController#update_oauth) che delegano internamente alle azioni regolari (ad esempio UsersController#update). Quindi escludere questi dalla protezione contraffatta (protects_from_forgery :only => [:update]). Questo dovrebbe funzionare e potrebbe essere accettabile al limite per una o due azioni, ma ovviamente sarebbe una soluzione molto complicata.

  3. Sostituire la protezione Rails CSRF per ignorare le richieste OAuth. Non ho provato questo, ma sembra che dovrebbe essere possibile cambiare uno dei ganci (forse il filtro verify_authenticity_token) per considerare con successo le richieste OAuth.

Qualcuno si è imbattuto in questo prima? Qualche consiglio? O forse mi manca qualcosa di base?

risposta

5

Risponderò alla mia domanda. :)

Ho aggiunto il seguente metodo alle estensioni del controller OAuth. L'unica cosa che aggiunge l'implementazione predefinita è il controllo oauth?. Questo sembra fare il trucco e si sente come una soluzione abbastanza pulita.

def verify_authenticity_token 
    verified_request? || oauth? || raise(ActionController::InvalidAuthenticityToken)  
end 
Problemi correlati