Question Comment s'assurer que l'API Rails est sécurisée par CSRF?


J'ai développé l'application Rails avec l'API REST pour un accès depuis une application mobile.

Cela fonctionne assez bien. Lorsque l'utilisateur se connecte depuis une application mobile, il obtient auth_token qu'il utilise dans ses futures requêtes à l'API. Le problème est que l’API est également accessible depuis le Web en allant sur path / api / v1 / ... et à cause de cela, elle doit être protégée de CSRF.

j'ai BaseApiController classe qui hérite de ApplicationController qui a protect_from_forgery "activée". Voici l'exemple:

class Api::V1::BaseApiController < ApplicationController
  # ...
end

class ApplicationController < ActionController::Base
  protect_from_forgery
  # ...
end

Maintenant, quand je fais des requêtes non-GET à mon API, avec auth_token, ma demande est terminée avec succès, mais dans les journaux, je peux voir le célèbre WARNING: Can't verify CSRF token authenticity. Si j'enlève protect_from_forgery de mon BaseApiController, Je ne reçois aucun avertissement (évidemment), mais alors mon API est vulnérable aux attaques CSRF (j'ai créé un simple formulaire HTML qui modifie avec succès les données entre les domaines protect_from_forgery).

Ma question est la suivante: comment assurer la sécurité de mon API, mais aussi supprimer l'avertissement lors de requêtes non-GET?

Voici l'une des solutions que j'ai proposées, mais elle ressemble plus à un hack et exécute une requête DB supplémentaire:

class Api::V1::BaseApiController < ApplicationController
  # ...
  def verified_request?
    super || User.where(authentication_token: params['auth_token']).count > 0
  end
end

Plus de détails sur le projet: Rails 3.2.14, Devise, AngularJS. Le code source du projet peut être trouvé ici.


12
2017-08-22 11:17


origine


Réponses:


Vous pouvez voir des gens suggérer que CSRF n'est pas un problème pour les requêtes API (il n'y a pas d'état pour commencer, alors qu'est-ce qu'il y a à détourner de toute façon?)

skip_before_filter :verify_authenticity_token, :only => [:your_method]

Cependant, il y a eu quelques commentaires selon lesquels il est possible d’engager CSRF avec text/plain en utilisant diverses méthodes basées sur Flash et Java. Je crois que c'était la raison de la mise en place du correctif de sécurité dans les rails: http://weblog.rubyonrails.org/2011/2/8/csrf-protection-bypass-in-ruby-on-rails/

En tout état de cause, vous trouverez ici une bonne solution pour rechercher un jeton d’authenticité: AVERTISSEMENT: Impossible de vérifier les rails d'authenticité des jetons CSRF

Cela implique de définir l'en-tête dans votre requête.

Bonne chance!


8
2017-08-22 13:43