Posted filed under Ruby on Rails.

Photo by icanteachyouhowtodoit

レスポンスコードでステータスを判断するとFreeSpotとかで問題にならない?からの続き。

 ステータスコードで200が帰ってきたときに、ほんとに自分が通信したいサーバから帰ってきたかを検証する方法を考えてみました。

 ほんとに相手のサーバを認証したい場合はSSLを使うべきですが、そんなに大事にしたくない場合は、HTTPレスポンスヘッダに特定の値をセットすることで、相手を特定できるのではないかと思います。

 Railsのbefore_filterなどでresponse.headersをセットしてもいいのですが、これだとcacheに入った場合など、Railsを通らないときには、ヘッダが追加されません。
そのため、mod_railsの場合はApacheで、mongrelの場合はmogrel内でヘッダにセットする必要があります。

 Apacheでは、Headerディレクティブでヘッダを書き換える事ができます。これを使う場合にはmod_headersを有効にしてください。

<VirtualHost *>
....
  Header set X-AppName sticka
</VirtualHost>

 mongrelの場合には、config/environment.rbに下記のコードを追加します。

if defined?(Mongrel) && defined?(Mongrel::Rails)
  class Mongrel::Rails::RailsHandler
    alias process_without_appname process
    def process(request, response)
      response.header['X-AppName'] = 'sticka'
      process_without_appname(request, response)
    end
  end
end

 これで、開発で使っているmongrelでも、実環境のApacheでもHTTPレスポンスヘッダのX-AppNameにはstickaが設定されます。

 外部からAPIをアクセスする際には、X-AppNameを検証することで、プロキシなどによって勝手にリダイレクトなどをされても、それを検出することができます。