0

私はElastic BeanstalkでDjangoアプリケーションを実行しており、毎晩ジョブを実行したいと考えています(検索エンジンの再インデックス)。 AWS docsによると、cron.yamlを使用すると、適切なタイミングで自分のアプリに自動的にPOSTリクエストを行い、適切に応答するようにアプリを設定することができます。cron.yamlリクエストにのみ応答するようにPOSTエンドポイントを設定してください

私のアプリが自動的に生成されたリクエストにのみ反応し、同じURLに対するランダムなリクエストには反応しないようにするにはどうすればよいですか?具体的には、私は悪意のあるユーザーが投稿してアプリに何かをさせることを望まない。あなたは、要求がcron.yamlから来ていることを確認するためにいくつかのことを確認することができます

+0

確かに、要求がPOSTであることを確認できますか? –

+0

@DanielRoseman悪意のあるユーザーの投稿を停止したい – Flash

答えて

0

...

1)要求がlocalhostから来るということです。

2)User-Agentは、aws-sqsdを含みます。

3)リクエストはワーカーインスタンスでのみ処理する必要があります。

私はbefore_actionのフィルタを使用してこれらをコントローラに適用します。コードは次のようになります。

## 
# 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

ありがとうございます。 2は簡単に偽装することができます。 1はおそらくTCPハンドシェイクのせいでできませんが、危険なようです(Djangoが 'X-FORWARDED-FOR'などをどのように扱うかはわかりません)。 3はワーカーインスタンスにトラフィックを送信しないELBに依存しています(これに頼ることはできますか?) – Flash

+0

ロードバランサを正しく設定した場合は、Webインスタンスについてのみ認識する必要があります。 – Brian

関連する問題