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を検証することで、プロキシなどによって勝手にリダイレクトなどをされても、それを検出することができます。