主にプログラミングに関して。Python, .NET Framework(C#), JavaScript, その他いくらか。
記事にあるサンプルやコードは要検証。使用に際しては責任を負いかねます

スポンサーサイト

                
tags:
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Python-Tornado: 公式のブログデモに付加しなければならないと思うもの

                
 Pythonでノンブロッキングなサーバを構築できるTornado。そのデモにブログのサンプルコードがある。サンプルなので簡単に分かりやすく書いたと思うのだけど、ちょっと考えるところがあったので書いておく。
https://github.com/facebook/tornado/blob/master/demos/blog/blog.py


 まず些末なところで"id"を変数名に使ってるけど、これ予約語。組み込み関数でidってのが用意されてる。idという変数名は避けたほうが無難。

 上のは大したものではなくて、気になるのはデモのセキュリティ。BaseHandlerクラスを定義して、そこにget_current_userメソッドを定義する。そしてBaseHandlerクラスを継承してリクエストハンドラを定義、デコレータでauthenticatedをつければ認証済みユーザのみにコンテンツを返せる。で、デモでは認証済みのユーザにはクッキーにユーザIDをセットしている。
class BaseHandler(tornado.web.RequestHandler):
@property
def db(self):
return self.application.db

def get_current_user(self):
user_id = self.get_secure_cookie("blogdemo_user")
if not user_id: return None
return self.db.get("SELECT * FROM authors WHERE id = %s", int(user_id))

 クッキーにユーザIDを入れるのは基本的には禁じ手。この場合set_secure_cookieというTornadoに用意された文字列のハッシュ化メソッドを使ってクッキーに入れるIDを特定がほぼ不可能な文字列にエンコードしている。だがこのエンコードされた文字列を盗聴などで一度手に入れてしまえば、クッキーはクライアントが容易に改変できてしまうものだから、この場合はパスワードなしにずっとそのIDの持ち主になりすますことができるんじゃないだろか。Tornadoの公式ドキュメントにはタイムスタンプが付加されるので古いクッキーは無効になるとされているが、古いクッキーとそうでないクッキーの境はどこに置かれるんだろか。
 とりあえず確実なのはこのハッシュ化は盗聴に対して弱い。試しにブラウザを二つ用意して、片方でログインしてクッキーを取得して、ログインしていないブラウザでクッキーを仕込んでアクセスしてみたところ認証済みとして扱われた。

 セッション維持に使うべきは使い捨ての期限付きセッションIDで、このセッションIDとユーザIDを紐づけたものを一時的に使えるようにしておくべき。セッションIDを手に入れられてもそれは一時的にしか有効でない。ただその一時のあいだにデータ改ざんとかやられるとまずいという問題は残る。
参考

 セッション維持のために使っているクッキーの値を第三者に知られるのはまずい。でもなにもしなければクッキーは悪意の第三者がアクセスポイントを立てていると簡単に盗聴されてしまう。というわけで通信をSSLにして、サーバとクライアントの通信を暗号化してしまう。そうすれば通信路でのクッキー盗聴を防ぐことができる。さらにプラス一手でクッキーにセキュア属性を設定する。そうすればSSL通信でないHTTPリクエストに対してはクッキーの送受信がされない。
set_cookie("sessionID", "foooo", secure=True)
secure以外にDomainやPathという属性もあるが、secure属性を設定しておけばそれ以上の効果を望めるものではない。
参考


 というわけでブログサービスに限らず第三者に知られてはまずいクッキーを使う場合は、SSL通信でなおかつクッキーには念のためsecure属性を設定しておく。でないとまずいことになる。
            

コメントの投稿

非公開コメント

プロフィール

hMatoba

Author:hMatoba
Github

最新記事
リンク
作ったものなど
月別アーカイブ
カテゴリ
タグリスト

検索フォーム
Amazon
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。