0

J'ai une application Django s'exécutant sur Elastic Beanstalk et je souhaite exécuter un travail tous les soirs (réindex du moteur de recherche). Selon AWS docs je peux utiliser cron.yaml pour faire automatiquement POST demandes à mon application au bon moment, et configurer mon application pour répondre de manière appropriée.Configurer le point de terminaison POST pour répondre uniquement aux requêtes cron.yaml

Comment puis-je m'assurer que mon application ne répond qu'aux demandes générées automatiquement et non aux demandes aléatoires de la même URL? Plus précisément, je ne veux pas que des utilisateurs malveillants publient et incitent l'application à faire des choses.

+0

Vous pouvez simplement vérifier que la requête est un POST? –

+0

@DanielRoseman Je souhaite également empêcher un utilisateur malveillant de POSTing. – Flash

Répondre

0

Vous pouvez vérifier plusieurs choses pour vous assurer que la demande provient de cron.yaml ...

1) La demande viendra de localhost.

2) Le User-Agent comprend aws-sqsd.

3) La requête ne doit être gérée que par votre instance de travail.

J'utilise des filtres before_action pour les appliquer dans mon contrôleur. Le code ressemble à ceci:

## 
# Protect against abuse - requests must have the correct "User-Agent" header, 
# come from localhost, and will only be handled by worker instances. 
before_action :correct_user_agent 
before_action :correct_source 
before_action :worker_instance 

...controller code here... 

private 

## 
# Confirms the correct User-Agent header was sent. 
def correct_user_agent 
    return if request.headers.env["HTTP_USER_AGENT"].include?("aws-sqsd") 
    head(:forbidden) 
end 

## 
# Confirms the request is coming from localhost. 
def correct_source 
    return if request.local? || Rails.env.development? || Rails.env.test? 
    head(:forbidden) 
end 

## 
# Don't allow requests to be processed in the production web environment, since 
# it has a worker instance associated with it. 
def worker_instance 
    return unless Rails.env.production? 
    head(:forbidden) 
end 
+0

Merci. 2 peut être trivialement truqué; 1 probablement ne peut pas en raison de la poignée de main de TCP mais semble risqué (pas sûr comment Django manipule X-FORWARDED-FOR etc.); 3 repose sur le fait que ELB n'envoie pas de trafic à l'instance de travail (puis-je me fier à cela?) – Flash

+0

Si vous avez correctement configuré l'équilibreur de charge, il doit uniquement connaître les instances Web. – Brian