E71:mod_pythonでcookieを使ってみる(2)
Last-modified: 2013-08-24 (土) 02:14:21 (3688d)
Top / E71:mod_pythonでcookieを使ってみる(2)
E71:mod_pythonでcookieを使ってみる(2) †
さて、第2弾は、Cookie.MarshalCookie?を使ってみます。
Cookie.Cookieクラスとの大きな違いは、
- シークレットキーを使って、暗号化、復号をしてCookieの値を使う
- 1つのオブジェクトで複数の値を使える の2点です。
※MarshalCookie?を使わず、Cookie.Cookieで複数の値を使うサンプルはE71:mod_pythonでcookieを使ってみる(3)を参照
1個目の特徴としては、Cookieの偽装に対応できるってことです。(ユーザが保存したCookieを変造し、サーバに送信した際に、変造を発見することが出来ます。)
※詳しくは、mod_pythonのマニュアルを参照のこと
さてさて、ではサンプルを見てみましょう!
サンプルソースの内容は、前回(Cookie.Cookie)とほぼ同じで、
- id : 値を保持する
- counter : カウントアップする
という2つの値をCookieで保持し、処理します。
作成するファイルは、同じく以下のとおり
- .htaccess
- mcookie.py の2つで、小生は「demo22_mcookie」ってディレクトリに格納してます。
.htaccess †
.htaccessの内容は以下のとおり。
■.htaccess
# setting Handler SetHandler mod_python # Add Python Handler PythonHandler mcookie ←1 # Debug On PythonDebug On # Option OFF Options None
mcookie.py †
同じく、内容は以下のとおり。
■mcookie.py
from mod_python import Cookie,apache def handler(req): ck = Cookie.get_cookies(req, \ Cookie.MarshalCookie, secret='seckey') ← 1 if not ck.has_key('count'): values = {'counter':'0', 'id':'0001'} ← 2 ck = Cookie.MarshalCookie( \ 'count', values, secret='seckey') ← 3 num = ck.value['counter'] ← 4 id = ck.value['id'] ← 4 message = \ 'No sent MarshalCookie, \ so now create\n %s,%s' % (num, id) Cookie.add_cookie(req, ck) ← 3 else: countck = ck['count'] num = int(countck.value['counter'])\ + 1 ← 5 id = countck.value['id'] message = 'cookie is %s,%s' % \ (num,id) values = {'counter':num, 'id':id} ← 5 mck = Cookie.MarshalCookie('count',\ values,secret='seckey') ← 6 Cookie.add_cookie(req, mck) ← 6 req.write("<html>\n<body>\n<h1>\n") req.write(message) req.write("\n</h1>\n</body>\n</html>\n") return apache.OK
各行の解説
- MarshalCookie?の値を取り出す場合、get_cookieメソッドの第2引数に「Cookie.MarshalCookie?」クラスを指定し、また、第3引数に暗号/復号用のキー「secret='seckey'」を指定します。
※「seckey」は「3」or「6」で指定してます。 - MarshalCookie?クラスに設定するオブジェクトを作成します。
Cookieクラスとは違い、辞書オブジェクトをセットすることが出来ます。 - MarshalCookie?オブジェクトを作成します。
- 第1引数:クッキー名
- 第2引数:値 今回は辞書オブジェクト
- 第3引数:暗号/復号キー :任意&br; 作成したクッキーオブジェクトをadd_cookieメソッドを使ってリクエストオブジェクトにセットします。
- 画面表示用に、MarshalCookie?オブジェクトから「id」と「counter」の値を取得します。&br; ※ck.valueでセットした辞書オブジェクトが取得できて、その要素を['id']という形で指定している
- 送信されたクッキーからcounterの値を取り出し、カウントアップして、MarshalCookie?に再設定するオブジェクトを作る。
- valueをクッキーに再設定し、リクエストオブジェクトにセットします。
動かしてみる †
さてさて、資材を配置し、apacheを起動し、配置したURLにアクセスすると、このような画面が表示されます。
おお、1回目の画面が表示された
もう一回アクセスすると・・・
おお、ちゃんと足しこまれた! ちなみに、2つ目の「0001」ってのが「ID」です笑
さらにもう一回アクセスすると・・・
ちゃんと足しこまれた笑 さらにもう一回
添付ファイル:



